Ich entschied mich heute, Projekt Euler Problem 17 zu versuchen, und ich schrieb schnell einen ziemlich schnellen Code in C++, um es zu lösen. Aus irgendeinem Grund ist das Ergebnis jedoch falsch. Die Frage ist:Projekt Euler Problem 17 - Was ist los?
Wenn die Zahlen 1 bis 5 in Worten ausgeschrieben werden: eins, zwei, drei, vier, fünf, dann werden insgesamt 3 + 3 + 5 + 4 + 4 = 19 Buchstaben verwendet.
Wenn alle Zahlen von 1 bis einschließlich 1000 (eintausend) in Worten geschrieben wären, wie viele Buchstaben würden verwendet?
HINWEIS: Leerzeichen oder Bindestriche nicht zählen. Zum Beispiel enthält 342 (dreihundertzweiundvierzig) 23 Buchstaben und 115 (einhundertfünfzehn) enthält 20 Buchstaben. Die Verwendung von "und" beim Schreiben von Nummern entspricht der britischen Verwendung.
Ich weiß wirklich nicht warum, denn ich habe jeden Teil meines Programms gründlich überprüft und ich kann nichts falsch finden. Die einzige Sache, die ich finden könnte, ist, wenn ich auf 1000 überprüfe, prüft meine while-Schleife nicht richtig. Ich habe das behoben, indem ich das Limit meiner while-Schleife auf < 1000 statt < 1001 gesenkt und einfach 11 (onethousand = 11) manuell zur Summe addiert habe. Und trotzdem funktioniert es nicht. Ich würde es wirklich schätzen, wenn Sie mir sagen könnten, was los ist. Ich bin mir sicher, dass mein Code ziemlich schlecht ist, aber es ist in ein paar Minuten erledigt. Also hier ist es:
int getDigit (int x, int y)
{
return (x/(int)pow(10.0, y)) % 10;
}
int main()
{
string dictionary[10] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
string dictionary2[18] = { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" };
string dictionary3[10] = { "onehundred", "twohundred", "threehundred", "fourhundred", "fivehundred", "sixhundred", "sevenhundred", "eighthundred", "ninehundred", "onethousand" };
int i = 1;
int last;
int first;
int middle;
_int64 sumofletters = 0;
while (i < 10) //OK
{
sumofletters += dictionary[i].length();
i++;
}
cout << sumofletters << endl;
while (i < 20) //OK
{
last = i % 10;
sumofletters += dictionary2[last].length();
i++;
}
while (i < 100) //OK
{
first = (i/10) + 8;
last = i % 10;
if (last != 0)
{
sumofletters += dictionary2[first].length() + dictionary[last].length();
}
else
sumofletters += dictionary2[first].length();
i++;
}
cout << sumofletters << endl;
while (i < 1000) //OK
{
last = i % 10;
first = (i/100) - 1;
middle = (getDigit(i, 1)) + 8;
if (middle != 0 && last != 0) //OK
{
if (middle == 1)
sumofletters += dictionary3[first].length() + dictionary2[last].length() + 3;
else
sumofletters += dictionary3[first].length() + dictionary2[middle].length() + dictionary[last].length() + 3;
}
else if (last == 0 && middle != 0) //OK
{
if (middle == 1)
sumofletters += dictionary3[first].length() + 6;
else
sumofletters += dictionary3[first].length() + dictionary2[middle].length() + 3;
}
else if (middle == 0 && last != 0) //OK
sumofletters += dictionary3[first].length() + dictionary[last].length() + 3;
else
sumofletters += dictionary3[first].length();
i++;
}
sumofletters += 11;
cout << sumofletters << endl;
return 0;
}
Für diejenigen, die nicht mit Project Euler Problem 17 vertraut sind, könnten Sie erklären, was es ist oder zumindest einen Link geben. Sie können nicht erwarten, dass die Leute Ihnen sagen, wo das Problem liegt, wenn sie nicht wissen, was das Programm tun soll. – ereOn
Oh ja .. vergaß das.Bearbeitet: P – Lockhead
Ich schlage vor, Sie lösen Ihr Rechenpuzzle in einer Computer-Mode: Holen Sie sich die Ausgabe in einer Form, die leicht verifiziert werden kann - drucken Sie die textliche Beschreibung jeder Zahl, zusammen mit Ihrer Berechnung der Anzahl der Buchstaben, dann haben a durchschauen und vor allem in den eher ungewöhnlichen Fällen eine Plausibilitätsprüfung durchführen. –