Fröhliche Zahlen
-
Hallo, ich schreibe grade ein Program zum sieben der fröhlichen Zahlen. Um es zu optimieren, soll das Programm bei einer Summe überprüfen ob es schon eine fröhliche Zahl ist oder eine unfröhliche Zahl ist, ansonsten mit dem überprüfen weitermachen.
void Sieben (vector<bool> &zahlen){ vector <int> zahlen2(zahlen.size(),0); zahlen2[0]=2; zahlen2[1]=1; for(int k=2;k<zahlen.size();++k){ if(zahlen[k]==0){ int d=k; vector <int> summen; int sum=0; while(d!=1){ while(d){ sum+=pow(d%10,2); d/=10; } summen.push_back(sum); for (int r=0;r<summen.size();++r){ if(sum==summen[r]){ for(int u=0;u<summen.size();++u) zahlen2[summen[u]]=2; break; } } } d=sum; sum=0; } } }
in Zeile 26 -31 soll die neu berechnete Summe mit allen anderen Summen überprüft werden und falls sie übereinstimmen sollen alle entsprechenden Indizes auf den Wert 2 gesetzt werden. Jetzt weiß ich aber nicht, wie ich die while-Schleife beenden kann, falls die Bedingung eintritt. Wenn ich ein break; einbaue, dann wird ja nur die for-Schleife beenden.
-
Eine Möglichkeit um eine äußere Schleife zu beenden ist die hier:
for(...) { bool close_extern = false; while(...) { ... if(diesunddas) { close_extern = true; // "beendet" die äußere Schleife break; } } if(close_extern) break; }
-
Sone schrieb:
Eine Möglichkeit um eine äußere Schleife zu beenden ist die hier
lol?
Entweder Flags oder Sprünge, aber bitte nicht mischen. Am besten ist immer ein return, so auch im Fall des OPs.
-
schleife in eine methode stecken und return...
-
Vielleicht erkärst du erst einmal, was 'fröhliche Zahlen sind'. Dieser Begriff ist in meinem bisherigen Leben mir noch nicht über den Weg gelaufen. Sind das die 'Schnapszahlen' wie 7777.77 für Nichtalkoholgefährdete?
-
Wie erwartet funktioniert mein programm garnicht und mird wird garnichts ausgegeben.
#include <iostream> #include <vector> #include <cmath> #include <iomanip> using namespace std; void Sieben (vector<bool> &z){ vector <int> zahlen2(z.size(),0); zahlen2[0]=2; zahlen2[1]=1; for(int k=2;k<zahlen2.size();++k){ if(zahlen2[k]==0){ int d=k; vector <int> summen; int sum=0; bool schliessewhile = false; while(d!=1){ while(d){ sum+=pow(d%10,2); d/=10; } summen.push_back(sum); if(zahlen2[sum]==1){ for(int u=0;u<summen.size();++u) zahlen2[summen[u]]=1; zahlen2[k]=1; break; } if (zahlen2[sum]==2){ for(int u=0;u<summen.size();++u) zahlen2[summen[u]]=2; zahlen2[k]=2; break; } for (int r=0;r<summen.size();++r){ if(sum==summen[r]){ for(int u=0;u<summen.size();++u) zahlen2[summen[u]]=2; zahlen2[k]=2; schliessewhile=true; break; } } if (schliessewhile) break; d=sum; sum=0; } // while if(schliessewhile==false){ zahlen2[k]=1; for(int u=0;u<summen.size();++u) zahlen2[summen[u]]=1; } } // if k==0 } // for k for(int k=0;k<z.size();++k){ if(zahlen2[k]==1) z[k]=true; } } void Ausgabe(const vector<bool> &z){ int i=0; for (int k=0;k<<z.size();++k){ if(z[k]){ cout<<setw(5)<<k; ++i; if(i>9) { cout<<'\n'; i=0; } } } cout<<'\n'; } int main(){ vector <bool> z(5000,false); Sieben(z); Ausgabe(z); }
Zumindest muss er mir doch die 1 zurückgeben, die ich standardgemäß so gesetzt habe?
-
Namal schrieb:
void Ausgabe(const vector<bool> &z){ int i=0; for (int k=0;k<<z.size();++k){ // !!!! if(z[k]){ cout<<setw(5)<<k; ++i; if(i>9) { cout<<'\n'; i=0; } } } cout<<'\n'; }
Sobald Du 'ne Ausgabe hast findest Du sicherlich auch wieder zurück auf die Spur!
-
berniebutt schrieb:
Vielleicht erkärst du erst einmal, was 'fröhliche Zahlen sind'. Dieser Begriff ist in meinem bisherigen Leben mir noch nicht über den Weg gelaufen. Sind das die 'Schnapszahlen' wie 7777.77 für Nichtalkoholgefährdete?
-
lops schrieb:
Sone schrieb:
Eine Möglichkeit um eine äußere Schleife zu beenden ist die hier
lol?
Entweder Flags oder Sprünge, aber bitte nicht mischen. Am besten ist immer ein return, so auch im Fall des OPs.Sein Code war tl;dr
Du machst es dir übrigens zu schwer.
Hier, ich hab' mal auf die Schnelle ein kleines Funktionstemplate geschrieben, die überprüft ob eine Zahl fröhlich ist :xmas1:template<typename Type> typename std::enable_if<std::is_integral<Type>::value, bool>::type isHappy(Type cur) { Type next; for(;;) { next = 0; while(cur) { Type mod = cur % 10; next += mod * mod; cur /= 10; } if(next == 1) return true; if(next == 4) return false; cur = next; } }
Damit kannst du jetzt deine Sieben-Funktion vereinfachen. Versuch, sie einfach nochmal zu schreiben :xmas2:
-
berniebutt schrieb:
Vielleicht erkärst du erst einmal, was 'fröhliche Zahlen sind'. Dieser Begriff ist in meinem bisherigen Leben mir noch nicht über den Weg gelaufen. Sind das die 'Schnapszahlen' wie 7777.77 für Nichtalkoholgefährdete?
Also jetzt echt mal.
http://bit.ly/TyzFac
-
Furble Wurble schrieb:
Sobald Du 'ne Ausgabe hast findest Du sicherlich auch wieder zurück auf die Spur!
Ohje mine...dankeschön. Aber jetzt gibt er mir einfach mal ALLE Zahlen zurück, aber ich suche weiter.
Sone schrieb:
Du machst es dir übrigens zu schwer.
Das Ding ist, selbst wenn ich jetzt wüsste was ein Template ist, bei uns wird es nicht gerne gesehen, wenn man von den Vorgaben abweicht.
-
Das Ding ist, selbst wenn ich jetzt wüsste was ein Template ist, bei uns wird es nicht gerne gesehen, wenn man von den Vorgaben abweicht.
Tut mir Leid
Aber du kannst es doch ganz einfach umschreiben... (soll ich?)
-
Sone schrieb:
Aber du kannst es doch ganz einfach umschreiben... (soll ich?)
Mir würde es helfen, wenn du sagst was für "Dummheiten" ich mache. Hab ich es jetzt richtig verstanden, dass man keinen Hilfsvektor benötigt?
-
Namal schrieb:
Mir würde es helfen, wenn du sagst was für "Dummheiten" ich mache.
Das ist dumm:
Um es zu optimieren, soll das Programm bei einer Summe überprüfen ob es schon eine fröhliche Zahl ist oder eine unfröhliche Zahl ist, ansonsten mit dem überprüfen weitermachen.
Kann in einer Endlos-Schleife enden!
Und optimiert auch überhaupt nicht, weil sowieso bis 1 durchgerechnet werden muss.
-
Sone schrieb:
Und optimiert auch überhaupt nicht, weil sowieso bis 1 durchgerechnet werden muss.
Warum? Wenn man auf eine Summe trifft, die bereits fröhlich oder unfröhlich eingetragen ist, dann muss man nicht mehr weiter rechnen und kann die zu untersuchende Zahl gleich entsprechend setzen. Bis 1 soll er nur dann rechnen, solange keine der Summen markiert ist.
-
Hör nicht auf Sone :xmas1:
-
Namal schrieb:
Sone schrieb:
Und optimiert auch überhaupt nicht, weil sowieso bis 1 durchgerechnet werden muss.
Warum? Wenn man auf eine Summe trifft, die bereits fröhlich oder unfröhlich eingetragen ist
Ach, ich hab' ganz vergessen. Du benutzt ja eine Tabelle wo du alle einträgst...
Dann vergiss die beiden Bemerkungen.
-
Hab ich es jetzt richtig verstanden, dass man keinen Hilfsvektor benötigt?
Ja. Versuch doch erstmal ohne. Schreib mein Funktionstemplate zu einer Funktion um (in dem du alle
Type
s durch einen integralen Typ deiner Wahl ersetzt) und mach in derSiebe
Funktion eine einfache Schleife :xmas2:
-
Sone schrieb:
template<typename Type> typename std::enable_if<std::is_integral<Type>::value, bool>::type isHappy(Type initial) { Type next, cur = initial; for(;;) { next = 0; while(cur) { Type mod = cur % 10; next += mod * mod; cur /= 10; } if(next == 1) return true; if(next == initial) return false; cur = next; } }
Ist das eigentlich so, dass der Zyklus immer mit dem initial Wert endet? Kommt 2 nicht ein den 4er Zyklus?
-
Ist das eigentlich so, dass der Zyklus immer mit dem initial Wert endet?
...
Lies bitte den Wikipedia-Artikel.Kommt 2 nicht ein den 4er Zyklus?
Ich verstehe nicht was du meinst. :xmas2: