2008-10-20.kl.14-19 Uppgift 1 (”Betyg 3 uppgift”) Du skall skriva ett program som räknar ut den största gemensamma delaren mellan två heltal som användaren matar in. Största gemensamma delaren är det största tal som båda talen går att dela med så att resultatet blir ett heltal. När du skall räkna ut vilken delare som är den största skall du använda följande algoritm: Antag att indata är talen A och B. 1) Om ”resten vid heltalsdivision mellan B och A” (d.v.s. B / A) blir 0 (noll) är den största gemensamma delaren A. 2) I övriga fall gäller att resultatet är detsamma som om man tar reda på den största gemensamma delaren mellan ”resten vid heltalsdivision mellan B och A” och ”A”. Krav: Du skall ta fram den största gemensamma delaren i en funktion som heter S_G_D som tar emot A och B som indata och returnerar delaren. Denna funktion skall vara rekursiv. Körexempel 1: Mata in två heltal: 123 33 Den största delaren är: 3 Körexempel 2: Mata in två heltal: 432 56 Den största delaren är: 8 Körexempel 3: Mata in två heltal: 362880 2415 Den största delaren är: 105 Körexempel 4: Mata in två heltal: 945 120 Den största delaren är: 15 Körexempel 5: Mata in två heltal: 558279 9687600 Den största delaren är: 621 Tips: mod 2008-10-20.kl.14-19 Uppgift 2 På en mattetävling i Versailles blev pristagarna hyllade till skyarna av de lokala tidningarna. De hade ritat in pristagarna på en prispall gjort av ett program skapat av en student i staden. Prispallen ser ni i figuren nedan. +-+ |1| +-+ +-+ |2 3| +-----+ Dock har tidningarna fått lite problem nu när de skall ha lagtävlingar i fysik inom kort. De vill därför ha ett program som ritar ut en (lite modifierad) prispall av lite olika storlek beroende på antalet deltagare i lagen. Din uppgift är att skapa detta program. Körexempel 1: Mata in antal deltagare i ett lag: 1 +-+ / /| +-+ +-+ /|1|/ /| +-+ +-+ + |2 3|/ +-----+ Körexempel 2: Mata in antal deltagare i ett lag: 2 +---+ / /| +-+---+ +---+ / | 1 |/ /| +---+ +---+ + | 2 3 |/ +-----------+ Körexempel 3: Mata in antal deltagare i ett lag: 9 +-----------------+ / /| +---------------+-----------------+ +-----------------+ / | 1 |/ /| +-----------------+ +-----------------+ + | 2 3 |/ +-----------------------------------------------------+ Uppgift 3 Enligt en matematiker som har letat primtal (manuellt) sen ”urminnes tider” finns det en textfil (som heter THE_FIRST_100000_PRIMES.TXT) med de första 100.000 primtalen. I denna fil har det dock smugit sig in ett antal tal som inte är primtal (förutom de 100.000 första primtalen). Din uppgift är att ta reda på vilka tal som inte är primtal i filen. Skriv ett program som tar fram de tal som inte är primtal och skriver ut dessa på skärmen. Det är givet att alla tal i filen ligger sorterade i storleksordning (med det minsta först). Det är också givet att alla de första 100.000 primtalen verkligen finns med i filen. När du fått fram vilka tal det är som inte är primtal skall dessa skrivas in i ditt program som en kommentar överst i din programfil. Kommentaren får gärna vara uppdelad på flera rader (med ett tal per rad). Definition: Ett tal är ett primtal om det endast är jämnt delbart med sig självt och 1. Undantag är talet 1 som inte är ett primtal. Tips: Då det kan ta lång tid att köra detta program (om man kontrollerar att ett tal är ett primtal på ett omständligt eller tidskrävande sätt) är det bra att göra utskrifter som visar att programmet fortskrider. Krav: Om det tar mer än 10 minuter att få fram resultatet är det inte någon bra lösning. Gör isåfall om ditt program så det löser problemet snabbare! Vi godkänner inte en lösning som tar extremt lång tid. Uppgift 4 Ada har, som många programspråk, problem att hantera riktigt stora tal (t.ex. 90-siffriga). Du skall därför implementera (skapa) ett paket som hanterar stora tal. Paktet skall heta Big_Numbers och det skall innehålla en procedur Get_Line som läser in ett positivt heltal som är maximalt 90 siffror långt och en procedur Put_Line som skriver ut ett stort tal. Get_Line skall ta bort eventuellt ”skräp” som finns på samma inmatningsrad (inklusive ENTER) och Put_Line skall se till att markören hamnar på ny rad. För att lagra heltalet skall du ha följande privata datatyp i ditt paket: type Big_Integer is array (1 .. 10) of Integer; De tio tal som ligger i denna vektor representerar tillsammans det stora talet. Antag att vi matar in talet 123456789012345678901234567890. Detta skall då delas upp i delar om 9 siffror (bakifrån) och de olika delarna lagras var för sig i vektorn. Vektorn kommer då att innehålla: (0, 0, 0, 0, 0, 0, 123, 456789012, 345678901, 234567890) Skriv dessutom ett program som läser in ett stort tal och sen skriver ut det igen. Körexempel 1: Mata in ett stort tal (max 90 siffror): 123456789012345678901234567890123456789012345678901234567890 Talet var: 123456789012345678901234567890123456789012345678901234567890 Körexempel 2: Mata in ett stort tal (max 90 siffror): 100000000000000000000000000000000000000000000000000000000000 Talet var: 100000000000000000000000000000000000000000000000000000000000 Körexempel 3: Mata in ett stort tal (max 90 siffror): 0 Talet var: 0 Körexempel 4: Mata in ett stort tal (max 90 siffror): 12345 12345 Talet var: 12345