Problem Nivå 1 Följande, ur problemsynpunkt enkla uppgifter, är till för att nöta in dagens teori. Problem 1 Skriv ett program som tar reda på hur många termer man måste ta med i serien för att summa ska bli > 3 2 Antal termer är 7 Summan är då 1.51180 1+ 1 4 + 1 9 + 1 16 +...+ 1 n 2 +... Problem 2 Talföljden 0,1,1,2,3,5,8,13,21,... kallas Fibonacci talföljd. Nästa tal i följden får man genom att summera de två föregående. Till exempel genom 13+21 = 34 får vi nästa tal i följden ovan. De två första talen i följden, 0 och 1 är givna. Skriv ett program som tar reda på det 40:e talet i denna följd. Det 40:e talet är 63245986 Problem 3 Ett primtal n är ett tal som endast har 1 och talet själv som delare (för inget annat p,1 < p < n går divisionen n jämnt upp). p Skriv ett program som tar reda på vilka av talen som är primtal. 7919, 1299711, 2750159 Tal att testa? 4256233 4256233 är primtal Talen 7919 och 2750159 är primtal. Dock inte 1299711. Observera hur snabbt datorn hinner utföra till exempel 2750157 divisioner! Håkan Strömberg 1 STH KTH
Problem 4 1 januari 2010 tänker du sätta in 1000 kr på banken till 4% årlig ränta. Ta reda på hur många år det kommer att dröja innan du är miljonär. Efter 177 år Problem 5 Skriv ett program som vänder på ett inmatat fyrsiffrigt tal Talet? 1235 Talet vänt 5321 Problem 6 Skriv ett program som tar reda på hur många minuter det är mellan två klockslag. Ett klockslag, till exempel 12 : 35 skriv i in programmet in som ett flyttal 12.35. Vi antar att de två klockslagen är från samma dygn. Från? 12.36 Till? 17.12 276 minuter Problem Nivå 2 Slantsingling Två spelare A och B singlar slant. Båda satsar inledningsvis, i varje omgång, en krona. A håller alltid på KRONA och B på KLAVE. Kommer KRONA upp vinner A potten i annat fall vinner B. Skriv ett program som simulerar detta spel där A alltid startar med 100 kronor och B med ett belopp 100 kronor och där spelet fortsätter tills någon av spelarna är utan pengar. Programmet ska bestämma sannolikheten att A blir den slutlige segraren och i medeltal hur många spel som krävs innan omgången är slut. Programmet ska, för att få en god approximation på denna sannolikhet, simulera 10000 omgångar. Vilket belopp har B vid starten: 50 I genomsnitt kommer en omgång att vara i 4854 spel A kommer att vinna 66.67% av omgångarna Håkan Strömberg 2 STH KTH
Enarmad bandit En enarmad bandit har tre hjul. På varje hjul finns siffrorna 1..9 precis en gång. Spelaren stoppar in en krona i banditen och drar i armen. De tre hjulen sätts igång, men stannar efter en stund. Nu kan resultatet avläsas i form av tre siffror. Har spelaren tur så blir det vinst. Här är vinstlistan, de belopp som maskinen kommer att spotta ut: 1 Alla siffror lika ger utdelningen 30 kronor. 2 Tre siffror i följd, dock nödvändigtvis inte i rad, till exempel 5,7,6, ger 1 kronor (alltså pengarna tillbaka) 3 Två siffror (men ej tre) lika, ger utdelningen 2 kronor Nu visar det sig att med den här vinstlistan, kommer ägaren till maskinen att i långa loppet gå med förlust. Hjälp honom därför, att med ett program, prova ut en ny passande vinstlista. Låt spelaren starta med 200 kronor och se till att sannolikheten för att spelaren ska bli bankrutt är ungefär lika stor som att han ska nå en vinst på 200 (nå upp till 400). Låt ditt program varje gång köra 1000 omgångar, där varje omgång avbryts av att spelaren, har slut på pengar eller uppnått minst 200 kronor i vinst. Utdelning vid vinst 1 : 30 Utdelning vid vinst 2 : 1 Utdelning vid vinst 3 : 2 Spelaren vinner 68.4 % av de 1000 omgångarna Prislistan kan dock konstrueras, så att resultatet kommer närmare 50%. Seven Eleven När Leif Eriksson var i Amerika senast, närmare bestämt i New York, smet han in i en SevenEleven-butik och köpte bananer, apelsiner, päron och äpplen. När han skulle till att betala kom den snabbtänkte vikingen på, att både summan och produkten av priserna på de fyra frukterna var $7.11. Skriv ett program som bestämmer fyra priser på frukterna sådana att villkoren ovan är uppfyllda (1 dollar = 100 cent). Håkan Strömberg 3 STH KTH
Lösningsförslag Nivå 1 Problem 1 double sum=0.0; int n=0; while(sum<3.0/2.0){ n++; sum=sum+1.0/(n*n); printf("antal termer är %d\n",n); printf("summan är då %.5f\n",sum); Problem 2 int f1=0,f2=1,f3,i; for(i=1;i<=38;i++){ f3=f1+f2; f1=f2; f2=f3; printf("det 40:e talet är %d\n",f3); Problem 3 int i,tal,ok=1; printf("tal att testa? "); scanf("%d",&tal); for(i=2;i<=tal-1;i++) if(tal%i==0) ok=0; if(ok==1) printf("%d är primtal\n",tal); else printf("%d är inte primtal\n",tal); Håkan Strömberg 4 STH KTH
Problem 4 int ar=0; float belopp=1000.0; while(belopp<1000000.0){ ar++; belopp=belopp*1.04; printf("eter %d år\n",ar); Problem 5 int tal,t,h,d,e,vtal; printf("talet? "); scanf("%d",&tal); t=tal/1000; h=tal%1000/100; d=tal%100/10; e=tal%10; vtal=e*1000+d*100+h*10+t; printf("talet vänt %d\n",vtal); Problem 6 float t1,t2,m1,m2,sm; printf("från? "); scanf("%f",&t1); printf("till? "); scanf("%f",&t2); m1=(t1-(int)t1)*100; t1=(int)t1; m2=(t2-(int)t2)*100; t2=(int)t2; if(m1>m2){ t2--; sm=60+m2-m1; else sm=m2-m1; sm=sm+(t2-t1)*60; printf("%.0f minuter\n",sm); Håkan Strömberg 5 STH KTH
Lösningsförslag Nivå 2 Slantsingling #include <conio.h> int b,s,n,tot=0,i,s1,bv=0; srand(time(0)); printf("hur många kr har spelaren från början: "); scanf("%d",&s); for(i=1;i<10000;i++){ b=100; s1=s; n=0; while(b>0 && s1>0){ n++; if(rand()%2==1){ s1++; b--; else { s1--; b++; if (s1==0) bv++; tot=tot+n; printf("en omgång räcker i genomsnitt %.2f spel\n",tot/10000.0); printf("banken vinner %.2f %% av spelen\n",bv/100.0); getch(); Håkan Strömberg 6 STH KTH
Enarmad bandit #include <conio.h> int belopp,r1,r2,r3,tmp,i,vinst=0; int v1,v2,v3; srand(time(0)); printf("utdelning vid vinst 1 : "); scanf("%d",&v1); printf("utdelning vid vinst 2 : "); scanf("%d",&v2); printf("utdelning vid vinst 3 : "); scanf("%d",&v3); for(i=1;i<=1000;i++){ belopp=200; while(belopp>0 && belopp<400){ belopp--; r1=rand()%9+1; r2=rand()%9+1; r3=rand()%9+1; if(r1>r2) {tmp=r1; r1=r2; r2=tmp; if(r1>r3) {tmp=r1; r1=r3; r3=tmp; if(r2>r3) {tmp=r2; r2=r3; r3=tmp; if(r1==r3)// Alla lika (1) belopp=belopp+v1; else if(r1==r2 r2==r3) // Två lika (3) belopp=belopp+v3; if(r1+1==r2 && r2+1==r3) // Ordningsföljd (2) belopp=belopp+v2; if (belopp>=400) vinst++; printf("sannoliketen för vinst är %.3f%%\n",vinst/10.0); getch(); Håkan Strömberg 7 STH KTH
Seven Eleven Ett första försök int a,b,c,d; float p,s; for(a=1;a<=711;a++) for(b=1;b<=711;b++) for(c=1;c<=711;c++) for(d=1;d<=711;d++){ p=a*b*c*d/1000000.0; s=a+b+c+d/1000000.0; if(p==7.11 && s==7.11) printf("%d %d %d %d\n",a,b,c,d); Trots att programmet teoretiskt är korrekt konstruerat fungerar det inte som väntat. Vi har en loop med 4 kapslade for-satser. Hur många exekveras de tre satserna inuti loopen? 711 4 = 353360102481. Hur lång tid det kommer att ta beror förstås på hur snabb dator den körs på. Vid ett tillfälle kommer datorn att försöka beräkna 771 4 och lagra i ett heltal med 32-bitar som maximalt kan lagra ett tal 2147483647. Observera att datorn inte meddelar när det sker overflow. Ett nytt försök: int bananer,applen,apelsiner,paron; double prod; for(bananer=1;bananer<=711;bananer++) for(paron=bananer;paron<=711;paron++) for(applen=paron;applen<=711;applen++){ apelsiner=711-bananer-paron-applen; if(apelsiner>=applen){ prod=bananer/100.0*paron/100.0*applen/100.0*apelsiner/100.0; if(prod==7.11) printf("%d %d %d %d\n",bananer,paron,applen,apelsiner); printf("*** KLAR ***"); För det första behöver vi bara tre for-loopar. Priset för apelsinerna kan vi räkna ut eftersom vi känner priset på de andra tre frukterna och och summan av priserna. Håkan Strömberg 8 STH KTH
Dessutom kan startvärdet för varje for-loop sättas till aktuellt värde hos tidigare loop-variabel. Detta leder till att satsen inuti for-loopen endast behöver exekveras 60 157 236 gånger. Genom att skriva tilldelningssatsen som här undviker vi att få overflow. Med denna version får vi resultatet 1.20, 1.25, 1.50, 3.16 efter mindre än en sekund. I denna kurs behöver vi inte tänka så mycket på effektivitet hos våra program. Exemplet visar dock att det finns gränser för hur ineffektiva program vi får skriva! Håkan Strömberg 9 STH KTH