Tie koodariksi

Ohjelmoinnin alkeet

Luku 8: Hakuohjelma

Koska tietokone on tehokas, voimme ratkaista monia tehtäviä automaattisesti käymällä läpi kaikki mahdolliset ratkaisut ja valitsemalla ratkaisun, joka täyttää halutut ehdot.

Arvoitus 1

Aloitamme ratkaisemalla seuraavan arvoituksen:

Tiedämme, että Maija on viisi vuotta nuorempi kuin Uolevi, ja lisäksi jos kerromme heidän ikänsä keskenään, saamme luvun 594. Kuinka vanhoja Maija ja Uolevi ovat?

Jotta voimme ratkaista arvoituksen, meidän täytyy pukea se tietokoneen ymmärtämään muotoon. Tässä tapauksessa voimme merkitä Maijan ikää x:llä, jolloin Uolevin ikä on x+5. Haluamme etsiä ratkaisun, jossa pätee ehto x*(x+5) == 594.

Seuraava ohjelma etsii arvoituksen ratkaisun käymällä läpi kaikki vaihtoehdot Maijan iälle silmukan avulla. Ohjelma olettaa, että Maijan ikä on ainakin 0 vuotta ja alle 120 vuotta, eli ohjelma käy läpi x:n arvot 0...119. Jokaisen iän kohdalla ohjelma tarkastaa, päteekö arvoituksen ehto, ja jos pätee, ohjelma tulostaa iät.

for x in range(120):
    if x*(x+5) == 594:
        print(x,x+5)

Kun suoritamme ohjelman, saamme seuraavan tuloksen:

22 27

Tämä tarkoittaa, että Maija on 22-vuotias ja Uolevi on 27-vuotias. Todellakin 27–22 = 5 ja 22*27 = 594, eli ratkaisu on oikein.

Arvoitus 2

Ratkaistaan vielä toinen arvoitus:

Liisalla on pussillinen kuulia. Jos hän jakaa kuulat neljän ryhmiin, kolme kuulaa jää yli. Jos hän jakaa kuulat viiden ryhmiin, neljä kuulaa jää yli. Jos hän jakaa kuulat seitsemän ryhmiin, kolme kuulaa jää yli. Montako kuulaa Liisalla on yhteensä?

Merkitsemme kuulien määrää x:llä, ja haluamme löytää ratkaisun, joka täyttää kolme ehtoa: x%4 == 3, x%5 == 4 ja x%7 == 3. Koska haluamme kaikkien ehtojen pätevän yhtä aikaa, yhdistämme ne and-sanalla.

Tarvitsemme vielä silmukkaa varten jonkin ylärajan kuulien määrälle. Oletamme, että kuulia on alle tuhat, eli käymme läpi x:n arvot 0...999. Tuloksena on seuraava ohjelma:

for x in range(1000):
    if x%4 == 3 and x%5 == 4 and x%7 == 3:
        print(x)

Kun suoritamme ohjelman, se tulostaa seuraavat ratkaisut:

59
199
339
479
619
759
899

Siis välillä 0...999 on seitsemän ratkaisua eikä tehtävään ole yksikäsitteistä ratkaisua. Pienin mahdollinen ratkaisu on, että Maijalla on 59 kuulaa.

Jos haluamme löytää vain yhden ratkaisun, voimme muuttaa ohjelmaa näin:

for x in range(1000):
    if x%4 == 3 and x%5 == 4 and x%7 == 3:
        print(x)
        break

Tässä komento break saa aikaan, että silmukka päättyy heti, kun löydämme ratkaisun. Niinpä ohjelma tulostaa vain pienimmän ratkaisun:

59

Tehtävä 1 Ratkaisematon

Kotivalo on vuoden vanhempi kuin Justiina, joka taas on vuoden vanhempi kuin Aapeli. Heidän ikiensä tulo on 42840. Kuinka vanha Aapeli on?

Kirjoita ohjelma tähän:


Tehtävä 2 Ratkaisematon

Väinön ikä on nyt kaksinkertainen Annan ikään nähden, mutta 20 vuotta sitten hänen ikänsä oli kolminkertainen Annan ikään nähden. Kuinka vanha Anna on nyt?

Kirjoita ohjelma tähän:


Tehtävä 3 Ratkaisematon

Mikä on pienin positiivinen kokonaisluku, joka on jaollinen luvuilla 12, 34 ja 56?

Kirjoita ohjelma tähän:


Tehtävä 4 Ratkaisematon

Välillä 1...10 on 6 lukua, jotka ovat jaollisia ainakin yhdellä luvuista 3, 5 ja 7. Nämä luvut ovat 3, 5, 6, 7, 9 ja 10.

Moniko luku välillä 1...1000 on jaollinen ainakin yhdellä luvuista 3, 5 ja 7?

Kirjoita ohjelma tähän:


Tehtävä 5 Ratkaisematon

Etsi kokonaisluku x, joka ratkaisee yhtälön x3 - 60x2 + 60x = 59.

Kirjoita ohjelma tähän:


Tehtävä 6 Ratkaisematon

Alamme laskea yhteen lukuja 1+2+3+... Jos haluamme summaksi vähintään sata, meidän tulee laskea yhteen 14 lukua, koska 1+2+3+...+14 = 105. Montako lukua meidän tulee laskea yhteen, jos haluamme summaksi vähintään miljoona?

Kirjoita ohjelma tähän: