Erstellen eines c++ Programms dass variationen ohne wiederholungen berechnet
-
Hallo alle zusammen
ich habe ein probelmm ich hänge fest und finde leider nichts passendes was mir weiter hilft in google.
Ich möchte ein C** Programm erstellen, welches variationen ohne Wiederholungen berechen kann.
Formel hierfür
n!
----
(n-K)!Nun um die fakultät berechnen zu lassen hätte ich schon mal was und zwar
using namespace std;int main()
{
int fakultaet = 1, eingabe;
cout << "Von welchem Wert soll die Fakultaet berechnet werden? ";
cin >> eingabe;
for (int i = eingabe; i > 0; i--)
fakultaet = fakultaet * i;
cout << "Das Ergebnis ist " << fakultaet << endl;
{
aber weiter komme ich nicht
ich habe keinen ansatz bzw. fällt mir einfach keiner ein
meine 1. überlegeung warnun die daten für n und k einlesen zu lassen
und dan von diesen wieder die fakultät berechenen zu lassen.Und danach fakultät 1 / fakultät 2 teilen zu lassen
Doch das klingt selbt mir nicht so gans logisch,
bitte kann mir jemand helfen ich benötige dringend denk anstöße bzw. grund ideen für ein skript
---bitte
-
Willst du die Anzahl der Wiederholungen (mit Berücksichtigung der Reihenfolge) berechnen? Denn dafür ist n! / (n-k)! da.
Du könntest natürlich zuerst n! ausrechnen, dann (n-k)! und anschließend die Werte dividieren, aber es wäre noch geschickter, einfach das Produkt (n-k+1) * (n-k+2) * ... * n auszurechnen.
-
Und was wäre einfacher?
wären die zwei formeln das selbe?
Es sollen keine Wiederholungen berücksichtigt werden
-
evy schrieb:
Und was wäre einfacher?
Das nimmt sich nicht viel. Die zweite Variante funktioniert für größere Zahlen, da es nicht so schnell zu einem Überlauf kommt.
wären die zwei formeln das selbe?
Ja.
Es sollen keine Wiederholungen berücksichtigt werden
Was genau verstehst du unter einer Wiederholung?
-
Es gibt ja zwei varianten
die 1. ist mit zurücklegen also ich nehme die zahl nicht entgüldig raus , dies wäre dann die variante der Wiederholungdie 2. ohne Zürücklegen , sprich die zahl fällt aus dem pott so zu sagen , dies wäre dann die variante ohne Wiederholung
die formel für mit Wiederholung ist simpel
n/k
ohne wiederholung ist
n!/(n-k)!So weit hab ich das auch alles begriffen und rechnen kann ich damit schon auch das
aber in einen Script zu bringen fällt mir einfach schwer .
Weil ich keine Vergleichspunkte habe an den ich mich orientieren kann.So mein Gedanke :
Ich lass von n! die fakultät berechnen ,
dann soll das programm sich diesen wert merken.Dan soll mann den wert für N und für K einlesen.
diese Subtrahierne und den wert merken
von diesem wert die fakultät ausrechen , auch diesen wert merken
und dan fakultät 1 durch fakultät 2 teilenbin ich auf dem richtigen weg?
Und wie mach ich das ?
-
evy schrieb:
die formel für mit Wiederholung ist simpel
n/kEigentlich ists n^k.
So mein Gedanke :
Ich lass von n! die fakultät berechnen ,
dann soll das programm sich diesen wert merken.Dan soll mann den wert für N und für K einlesen.
diese Subtrahierne und den wert merken
von diesem wert die fakultät ausrechen , auch diesen wert merken
und dan fakultät 1 durch fakultät 2 teilenbin ich auf dem richtigen weg?
Die Reihenfolge stimmt noch nicht. Du berechnest bereits n!, bevor du n überhaupt einliest.
-
was hälst du davon?
#include <cstdlib>
#include <iostream>using namespace std;
int main()
{
int zahln, zahlk, wert1, wert2;
cout << " Geben Sie eine Zahl für n ein" <<;
cin >> eingabe1;
cout << " Geben Sie eine Zahl für k ein " <<;
cin >< eingabe2;
nt fakultaet = 1, eingabe;for (int i = eingabe1; i > 0; i--)
fakultaet = fakultaet1 * i;
wert1 eingabe1 * eingabe2);
for (int i = wert1; i > 0; i--)
fakultaet = fakultaet2 * i;
wert2 = (fakultatet1% fakultaet2)
cout << "Das Ergebnis ist " << wert2 << endl;
return 0;}
-
Du könntest deine Programme wenigstens mal ausprobieren, bevor du sie postest
Und schau dir mal die Operatoren an. Dividieren tut man mit /, % ist Modulo.
-
Ja
ich weis das dieses Programm nicht läuft , es ist ein Prototyp ich will wissen ob ich auf dem richtigen weg bin bzw. Wo ich ansetzen muss, oder ob der Grundgedanke schon falsch ist.
-
Woher soll man das wissen? Der Grundgedanke ist aus diesem Trümmerhaufen nicht erkennbar. Ich weiß ehrlich gesagt auch nicht, was man hier großartig für Grundgedanken braucht. Du hast eine Formel, und der naive Ansatz ist, sie einfach so, wie sie dasteht, zu implementieren.
n! / (n-k)!
Subtraktion und Division ist in die Sprache eingebaut, es fehlt nur die Fakultät. Die kriegst du offensichtlich mithilfe von Schleifen hin. Eingabe/Ausgabe ist klar. Fehlt noch was?
Wenn du das hinkriegst, solltest du dich allerdings fragen, ob man das nicht noch besser lösen kann. Dazu hast du hier auch schon einen Tipp bekommen.
-
Sorry aber deine Antwort hilft mir gerade nicht groß weiter ,
eine genaue bezeichung und erklärung meiner fehler wären toll.Wo ist mein fehler , was ist mein fehler und zwar genau das würde mir weiter helfen.
Und deshalb bin ich hier um genaue hilfe und tipps zu bekommen und zwar so ausgedrückt das ich sie versteh und umsetzen kann.
-
evy schrieb:
Sorry aber deine Antwort hilft mir gerade nicht groß weiter
Das tut mir leid.
eine genaue bezeichung und erklärung meiner fehler wären toll.
Mach aus deinem Prototypen ein richtiges, ernstgemeintes Programm und melde dich dann nochmal.
-
evy schrieb:
Sorry aber deine Antwort hilft mir gerade nicht groß weiter ,
eine genaue bezeichung und erklärung meiner fehler wären toll.#include <cstdlib> // Schlecht. Benutzt du nicht #include <iostream> using namespace std; int main() // Schlecht. Ungewöhnliche Leerzeilen { int zahln, zahlk, wert1, wert2; // Sehr schlecht. Nichtssagende Namen. zahln und zahlk werden nirgendwo benutzt. wert1 und wert2 viel zu früh deklariert. cout << " Geben Sie eine Zahl für n ein" <<; // Falsch. Auf << kann kein ; folgen cin >> eingabe1; // Falsch. eingabe1 ist nicht deklariert. cout << " Geben Sie eine Zahl für k ein " <<; // Falsch. Auf << kann kein ; folgen cin >< eingabe2; // Falsch. Auf > kann kein < folgen. eingabe2 nicht deklariert nt fakultaet = 1, eingabe; // Falsch. Datentyp nt exisitert nicht. Schlecht. Variable eingabe wird nirgends benutzt for (int i = eingabe1; i > 0; i--) fakultaet = fakultaet1 * i; // Schlecht. *= benutzen um zu zeigen, was man will. wert1 =( eingabe1 * eingabe2); // Falsch. Du brauchst für die Formel nirgends eingabe1 multipliziert mit eingabe2 for (int i = wert1; i > 0; i--) fakultaet = fakultaet2 * i; // Falsch. fakultaet2 nicht deklariert. Rechnung falsch. wert2 = (fakultatet1% fakultaet2) // Falsch. Rechnung falsch // Falsch. Fehlendes Semikolon cout << "Das Ergebnis ist " << wert2 << endl; // Schlecht. endl, wo '\n' gedacht ist. return 0; // Schlecht. Nicht verstanden, welche Sonderregeln für main gelten. // Schlecht. Ungewöhnliche Leerzeilen }
Verstehst du nun, warum Bashar dein Programm einen Trümmerhaufen genannt hat und dir nicht konkrete Fehler nennen konnte?
-
vielen vielen dank mit dieser hilfe kann ich arbeiten ,
ich werde mich sofort dran setzen und deine anmerkungen umsetezen
danke schön.
-
evy schrieb:
vielen vielen dank mit dieser hilfe kann ich arbeiten ,
ich werde mich sofort dran setzen und deine anmerkungen umsetezen
danke schön.Es ist frustrierend, wenn der TÜV ein Haus zur Notsprengung deklariert und der Hausbesitzer dies als Aufforderung versteht, die kaputten Glühbirnen zu wechseln.
-
Hier eine Variante für die Experten, die ganz ohne Rekursion und Multiplikation auskommt ...
#include <iostream> #include <functional> // plus<> #include <numeric> // adjacent_difference #include <vector> template< typename T > T n_ueber_k( T n, T k ) { using namespace std; vector< T > line; for( ; line.push_back( T(1) ), n > 0; --n ) adjacent_difference( line.begin(), line.end(), line.begin(), plus< T >() ); return line.at( k ); } int main() { using namespace std; for( int n, k; cin >> n >> k; ) cout << n << " ueber " << k << " = " << n_ueber_k( n, k ) << endl; return 0; }
Gruß
Werner
-
Gesucht ist nicht , sondern . (In der Hoffnung, dass dein Code auch tatsächlich ersteres berechnet )
-
Bashar schrieb:
Gesucht ist nicht , sondern . (In der Hoffnung, dass dein Code auch tatsächlich ersteres berechnet )
Bashar der Experte hat's gemerkt - mein Code berechnet . Das wäre die Anzahl der Variationen ohne Wiederholung und ohne Beachtung der Reihenfolge.
Gruß
Werner
-
Werner: Nette Art, das Pascalsche Dreieck aufzubauen. Aber etwas rechenintensiv, wenn man nur an einem Eintrag interessiert ist
-
Dieser Beitrag wurde gelöscht!