Uppgift 1 (”Betyg 3 uppgift”)

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