Fröhliche Zahlen
-
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:
-
Sone schrieb:
Ist das eigentlich so, dass der Zyklus immer mit dem initial Wert endet?
...
Lies bitte den Wikipedia-Artikel.Habe ich und besser verstanden als du.
Kommt 2 nicht ein den 4er Zyklus?
Ich verstehe nicht was du meinst. :xmas2:
Endlosschleife bei isHappy(2) mit deinem Code.
-
SchokoladeMandeln schrieb:
Sone schrieb:
Ist das eigentlich so, dass der Zyklus immer mit dem initial Wert endet?
...
Lies bitte den Wikipedia-Artikel.Habe ich und besser verstanden als du.
Sry, ich hab zu schnell gelesen.
Ja, du hast Recht. Ich muss aber nur eine Zeile änderntemplate<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; } }
-
Und jetzt noch mit Iteratoren!
template<typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type> T isHappy(T n) { for (;;) { n = std::sum(make_transform_iterator(digit_iterator(n), [](T t){return t*t;}), make_transform_iterator(digit_iterator(0), [](T t){return t*t;})); if (n == 1) return true; if (n == 4) return false; } }
-
Haha, ja .. wenn man C++11 benutzen darf
-
Ich habe mir nicht die Mühe gemacht, Deinen Algorithmus, den Du programmiert hast zu verstehen, allerdings habe ich eine Vermutung, was Du versuchst und wie.
Das wird so nicht funktionieren!
Der std::vector von C++ hat eine bestimme Größe und eignet sich nur bedingt, für die Abbildung aller möglichen quadrierten und summierten Ergebnisse, d.h. wenn Du auf einen Vektor an Stelle
zahlen2[summen[u]]
zugreifst, muss auch gelten:summen[u] < zahlen2.size()
. Entweder du vergrößerst Den Vector immer entsprechend, oder Du wählst einen anderen Container. Z.b. zweistd::sets
für fröhlich/traurig.Ausserdem: niemand mag Magic-Numbers:
const unsigned int happy = 1;