Permalänk
Medlem

Programmeringstrubbel

Har använt mig utav Internet för att försöka lära mig att programmera, och har nyss kommit in på det här med for-loopar, och har nyss kommit över en uppgift jag ej förstår mig på.

"Enligt legenden fick schackspelets uppfinnare, storvisir Sissa Ben Dahir, önska sig en belöning av kung Shirham av Indien. Den listige Sissa Ben Dahir bad då att få ett vetekorn för den första schackrutan, två för den andra rutan, fyra för den tredje rutan, åtta för den fjärde rutan osv. Hur mycket vete fick han?

Kan någon förklara hur detta ska lösas?

Permalänk
Hedersmedlem

Då man startar med ett kort och sedan multiplicerar med två för varje ruta skulle man kunna tänka sig en loop som går lagom många varv och just multiplicerar en variabel med två varje gång. Var dock beredd på att talet blir stort.

Permalänk
Medlem

Hah, om jag inte räknat helt hel (vilket inte skulle vara ovanligt) så skulle han få:

9223372036854775808 riskorn.

Permalänk
Medlem

Först kolla upp hur många rutor det finns på ett schackbräde, sen göra en for-loop som ser ut ungefär såhär;
$summa = $summa + 2^$i;
$i++;

Permalänk
Medlem

1844674407371E+19 är svaret, jag lyckades få fram det åtminstone i mitt php-script
18 446 744 073 709 551 615 för er som gillar vanlig sifferform

Permalänk
Medlem

Shit jag måste ha missat 1 av de 64 gångerna det dubblas

Permalänk

Beroende på vilket programmeringsspråk du använder så kan det vara väldigt viktigt att se till att variabeln har en typ som tillåter ett tillräckligt stort heltalsvärde.

Som dEnnA skrev så är svaret 2^64 - 1, så det får precis plats i ett 64-bit heltalsvärde utan teckenbit, vilket i t.ex. C# är ulong. Det får däremot inte plats i en variabel med typen int, uint eller long.

Permalänk

Det blir väll 2^63 + 1

64 rutor på ett schackbräde.
Första rutan ger endast 1, men därefter fördubblas det, dvs 2^n

Alltså egentligen blir det 2^(64-1) + 1 vilket är 9223372036854775809.

Visa signatur

○ Citera

Permalänk
Skrivet av Deliberation:

Det blir väll 2^63 + 1

64 rutor på ett schackbräde.
Första rutan ger endast 1, men därefter fördubblas det, dvs 2^n

Alltså egentligen blir det 2^(64-1) + 1 vilket är 9223372036854775809.

Den första rutan har 1 = 2^0 korn, den andra har 2 = 2^1 korn, osv, så att den n:te rutan har 2^(n-1) korn.

Om man summerar alla dem så blir det 2^0 + 2^1 + ... + 2^63, vilket är en geometrisk serie.

Om du jämför med konventionen de använder här, http://en.wikipedia.org/wiki/Geometric_progression#Geometric_..., så är a=1, r=2 och n=63, och lösningen blir:
1*(1 - 2^(63+1))/(1 - 2) = (1 - 2^64) / -1 = 2^64 - 1.

Du kan också se det som att varje term i summan är ett binärt tal med bara en bit satt (2^x), och summan blir då det binära talet med 64st ettor efter varandra. Det talet är ett mindre än talet med en etta och 64st nollor efter, vilket är 2^64.

Ett exempel fast med färre bitar:
2^0 + 2^1 + 2^2 + 2^3 = 1111b = 10000b - 1 = 2^4 - 1 = 15