-
Wo ist mein Fehler? C++
Hey Leute,
sorry für den doofen Threadtitel, mir ist kein besserer eingefallen.
Das Problem ist folgendes:
Wenn man alle Zahlen von 1 - 1000000 aneinanderreiht, und aus der dann entstehenden Zahl die Quersumme nehmen will, was ist das Ergebnis?
Naja ich gebe zu, ich bin kein Mathejunky und habe deshalb die Aufgabenstellung genutzt um mein C++ ein bisschen zu verbessern. Ich schätze mein Stil ist grauenhaft und irgendwo muss ein Fehler in meinem Denken gewesen sein. Es wäre super nett wenn irgendwer mal über den Source guckt und vielleicht meinen Denkfehler entdeckt. Ich persönlich komme gar nicht mehr klar :confused:
Code:
#include <iostream>
#include <math.h>
int Ziffern(int zahl){
int stellen = 0;
while(zahl > 0){
zahl /= 10;
stellen++;
}
return stellen;
}
int qsum(int zahl){
int stellen = 0, mod = 10,a = 0, b = 0, qsum = 0;
stellen = Ziffern(zahl);
while(stellen > 0){
a = (int)pow(mod,stellen);
b = (zahl % a) / (a/mod);
qsum += b;
stellen -= 1;
}
return qsum;
}
int main(void){
int i,a;
i = 0;
a = 0;
while(i < 1000000){
a += qsum(i);
i++;
}
std::cout << a << std::endl;
return 0;
}
Ich möchte keine Lösung für die Aufgabe, sondern eine Hilfestellung für den Quelltext. :)
MfG
lolly
-
Könntest du nochmals erläutern wie genau die Aufgabe lautet? Die wird mir nicht wirklich klar. Desweiteren könnte der Typ Int zu klein werden, was zu Problemen führen wird und du hast wirklich einen sehr "merkwürdigen" Stil.
Beispiele:
- keine Funktionsprototypen, sondern Funktionen über der Main Funktion
- while-Schleifen bei denen For-Schleifen viel besser passen würde
...und und und.
Ich würde dir empfehlen ein Buch zu kaufen und dir dann eine ordentlichen Stil anzugewöhnen. Insgesamt hilft ein Buch auch für viel besseres Verständnis.
-
Ja sorry^^ Habe seit >1Jahr kein C++ mehr geschrieben und dachte ich schaus mir mal wieder an...
Also du schreibst alle Zahlen von 1-1000000 aneinander ohne Punkt und Komma.
123456789101112...1000000
Und nimmst daraus die Quersumme. Ich lasse in der Funktion qsum jedes mal die Quersumme einzeln berechnen gerade aus dem von dir genannten Problem mit der Größe des Integer.
Ich hoffe die Erklärung war besser.
-
Ich verstehe gerade nicht so ganz die Aufgabe, wie sp1nny schon sagte.
Und was genau rechnest du da? Das Ergebnis wäre 50000 - wenn ich mich gerade nicht Vertue.
Du kannst mithilfe der Gauß'schen Summenformel alle Zahlen von 1-1000000 addieren, und dann durch 1000000 teilen. Das ist doch einfacher... Oder?
//Edit: Sorry, ich hab gepostet während du gepostet hast ^^
Ich hatte mal eine ähnliche Aufgabenstellung - die Lösung weiß ich nicht mehr, aber du konntest das "Problem" logisch lösen und nicht mit Mathe. Denk nochmal drüber nach, wie die bloße Anordnung der Zahlen sich zueinander verhält...
-
Ich glaube die Gauß'sche Summenformel ist nicht ganz passend, oder ich bin noch ein wenig durcheinander. Ich habe das Ganze mal anhand der Zahlen von 1-10 durchgespielt. Ich addiere alle zahlen und erhalte 55 teile das durch 10 und habe 5... meine gesuchte Zahl war aber 46.
Oder drehe ich grad komplett durch? :D
-
Ich habe hier mal ein Beispiel gemacht wie ich Quersummen bilden würde ( keine Ahnung was du für eine Akrobatik machst ;) ):
Code:
#include <iostream>
using namespace std;
//--------------------------------------------------------------------------
int csum(int);
//--------------------------------------------------------------------------
int main(void){
int iNumber;
cout << "Bitte eine Zahl eingeben zu der die Quersumme berechnet werden soll!" << endl;
cout << "Zahl: " ;
if(!(cin >> iNumber))
exit(1);
cout << "\n\nDie Quersumme von " << iNumber << " ist : " << csum(iNumber) << endl;
cin.ignore();
cin.get();
return 0;
}
//--------------------------------------------------------------------------
int csum(int iNumber){
int iChecksum = 0;
do{
iChecksum += iNumber % 10;
iNumber /= 10;
}while(iNumber > 0);
return iChecksum;
}
-
Nene, ich hatte geschrieben, während lolly gepostet hat - daher hab ich das "richtige" nicht mitbekommen.. ^^
Man beachte meinen Edit...
-
So wie ich dem Fragensteller verstehen geht es eher um ein aneinanderreihen á la String ( "1" + "2"= "12" ) und kein addiren.
deswegen würde ich eher sowas mit vorschlagen:
python (ungetestet):
Code:
grossezahlstr=""
for i in range(0,100000):
grossezahlstr+=str(i)
grossezahl=int(grossezahlstr)
quersumme=qsum(grossezahl)
ich bin doch einfach python fan
//edit
wobei mir gerade noch einfällt, dass es vielleicht bei sehr grossen Zahlen schneller geht wenn man in der schleife die quersummer der einzelnen Zahl berechnet und aufaddiert so muss man nicht die quersummer von der großen Zahlberechnen, wobei das ja eigentlich auch keine großen unterschied ausmachen müsste...
ich glaube es ist heute schon etwas zu spät für Matheakrobatik...
weil so ganz sicher bin ich mir jetzt da auch nicht
-
Und wie bildet man Quersummen ohne zu addieren? :)
Von der langen Zahl soll dieser nämlich gebildet werden.
-
@sp1nny bezieht sich deine Antwort auf meinen Post?
weil ich ja nur die Quersummen funktion aufrufe ich habe ja jetzt keine selber geschrieben.
aber ich finde so eine Aufgabenstellung ist einfach prädestiniert dazu in Python umgesetzt zu werden...