Tehtävä:
Kahden summa annetuista luvuista

Tämän tehtävän vastauksia MathCheck ei osaa tarkastaa, joten ne käsitellään vain laskuharjoitustilaisuudessa. Voit tarjota vastaustasi esitettäväksi vaikka et olisikaan saanut ihan jokaista kohtaa tehtyä.

Ohjelmalle annetaan `n` kappaletta lukuja `a_1`, …, `a_n`. Lukuja voi olla paljon. Ohjelma saa käsitellä niitä niin paljon kuin on tarpeen. Sen jälkeen ohjelmalle annetaan luku `s`. Ohjelman tulee tulostaa joko luvut `x` ja `y` siten, että ne molemmat ovat mukana luvuissa `a_1`, …, `a_n` ja `x+y = s`; tai teksti ”Ei onnistu”. Jälkimmäinen tarkoittaa, että lukua `s` ei voi muodostaa kahden alkuvaiheessa annetun luvun `a_i` ja `a_j` summana. Sitten ohjelmalle annetaan uusi `s` ja sen tulee tulostaa sille `x` ja `y` tai ”Ei onnistu”, ja niin edelleen. Lukuja `s` voi tulla hyvin monta.

Jos luvut ovat esimerkiksi 47, 16, 36, 4, 81, 9, 64 ja 25, niin `s=`100 saadaan muodostettua summana 36+64, joten ohjelman pitää tulostaa ”36 64” tai ”64 36”. Lukua `s=`10 ei saa muodostettua minään kahden annetun luvun summana, joten sille pitää tulostaa ”Ei onnistu”.

Tehtävänä on kertoa ohjelman toimintaperiaate. Ohjelmaa ei tarvitse toteuttaa.

(a) Ennen kuin käydään toimintaperiaatteen kimppuun, keskustellaan hetki siitä, onko tehtävä riittävän tarkasti määritelty. Onko edellä kerrottu, saako saman luvun käyttää kahdesti? Jos esimerkin luvuilla `s=`8, tuleeko ohjelman vastata ”4 4” vai ”Ei onnistu”? Entä jos luvut ovat 2 4 4 7 ja `s=`8, onko silloin ”4 4” oikea vastaus? Mitä vaikuttaa, jos tehtävän kuvaukseen lisätään `x != y`? Entä jos lisätään `i != j` siihen kohtaan, jossa mainitaan `a_i` ja `a_j`?

(b) Varmaan arvaat, että toimintaperiaatteeksi ei hyväksytä sitä, että luvun `s` saatuaan ohjelma kokeilee kaikki parit `(a_i, a_j)`. Miksi ei hyväksytä?

(c) Toimintaperiaatteeksi ei myöskään hyväksytä sitä, että ennen ensimmäistä lukua `s` ohjelma muodostaa kaikki mahdolliset summat `a_i + a_j` ja tallettaa ne jonnekin, ja luvun `s` saatuaan ohjelma tutkii tallettamansa summat. Miksi ei hyväksytä?

(d) Kerro hyvä toimintaperiaate!