[C++] Min for-loop vill inte gå över 113383

Permalänk
Medlem

[C++] Min for-loop vill inte gå över 113383

Hej

Jag har försökt skriva ett program som utföra följande uppgift: http://projecteuler.net/index.php?section=problems&id=14

Min kod är:

#include <iostream> int main() { int tal = 0; for(int i = 1; i < 1000000; i++) { std::cout << i; int j = i; int turns = 1; while(j != 1) { if(j % 2 == 0) { j = j / 2; ++turns; } else if(j % 2 == 1) { j = 3*j + 1; ++turns; } } std::cout << '\t' << turns << std::endl; if(turns > tal) tal = turns; } std::cout << tal << std::endl; std::cin.get(); return 0; }

Problemet är att for-loopen bara räknar upp till 113383.

Vet någon varför det är så?

Och om någon tycker att min kod är ineffektiv kan ni också göra anmärkningar på den, jag blir inte sårad

tack på förhand

Visa signatur

¯\_(ツ)_/¯

Permalänk
Hedersmedlem
Visa signatur

Är du lycklig nu?

Frågor och funderingar angående modereringen tas med mail, inte genom forumet. dennizpop@sweclockers.com

Permalänk
Medlem

tror int inte kan ta hand om så stora tal. pröva long

edit: för sent..

Visa signatur

Outtröttlig, löpartokig besserwisser!

Bli vegan! För djuren, planeten, hälsan och våra barns skull!

Permalänk
Medlem

Tack för svaren

När jag använde unsigned long fixade det sig.

Känns som ett totalt nybörjarfel >_>

Visa signatur

¯\_(ツ)_/¯

Permalänk
Medlem

Orsaken till att programmet hängde sig är som du nu vet att talet i j blev för stort, och eftersom j var signed så gick den över till att bli negativ. j % 2 blev därför -1, så din while-loop gick in i en oändlig loop. Att ändra j till att vara unsigned löser det omedelbara problemet med att programmet hänger sig, men det betyder inte att ditt svar är korrekt.

Eftersom j nu är unsigned så börjar den istället om på 0 istället för den negativa max-gränsen för typen. Om det händer så kommer ditt program fortfarande att ge ett svar, men svaret är i så fall inte korrekt. Du borde därför lägga in ett test i ditt program som kontrollerar att j inte blir för stor. I det här fallet så borde det räcka med att kolla att j inte är mindre efter j = j*3 + 1, dvs. spara det gamla värdet av j och jämför med.

Permalänk
Medlem

Jag satte den bara som unsigned long och det gick väl.

Men det är sant det som du säger, det är inte den säkraste varianten.

Visa signatur

¯\_(ツ)_/¯