Funktio – vaikeat tehtävät
Tehtävä 1. Toteuta funktio, joka selvittää, onko annettu merkkijono palindromi.
Palindromi on merkkijono, joka on sama etu- ja takaperin, kun siitä poistetaan välilyönnit. Syötteenä annetaan merkkijono, joka voi sisältää pieniä kirjaimia ja välilyöntejä. Vertailussa älä huomioi välilyöntejä.
Kokeile ovatko nämä merkkijonot palindromeja:
ellan nalle
saippuakauppias
puupää
isä älä myy myymälääsi
Kokeile koodia halutessasi myös muilla merkkijonoilla!
Esimerkki tuloste:
Sana <merkkijono> on palindromi
Sana <merkkijono> ei ole palindromi

Koodi:
def selvittaa_palindromin(sana):
alkuperainen = sana
sana = sana.replace(" ", "")
sana_takaperin ="".join(reversed(sana))
indeksi = 0
for i in sana:
if i == sana_takaperin[indeksi]:
if indeksi == len(sana)-1:
return f"Sana {alkuperainen} on palindromi"
else:
return f"Sana {alkuperainen} ei ole palindromi"
indeksi = indeksi + 1
print(selvittaa_palindromin("ellan nalle"))
print(selvittaa_palindromin("saippuakauppias"))
print(selvittaa_palindromin("puupää"))
print(selvittaa_palindromin("isä älä myy myymälääsi"))
Tuloste:
Sana ellan nalle on palindromi
Sana saippuakauppias on palindromi
Sana puupää ei ole palindromi
Sana isä älä myy myymälääsi on palindromi
Tehtävä 2. Toteuta seuraavat funktiot. Ensimmäinen funktio muuttaa kymmenjärjestelmän luvun binääriin ja toinen binääristä kymmenjärjestelmään.
Tapa 1.

Koodi:
def kymmenen_binaariin(luku):
binaari = ""
if luku == 0:
return "0"
else:
while luku > 0:
binaari = str(luku % 2) + binaari
luku = luku // 2
return binaari
def binaari_kymmenen(luku):
luku_takaperin = reversed(str(luku))
indeksi = 0
kymmenjarj = 0
if luku == 0:
return "0"
else:
for i in luku_takaperin:
kymmenjarj = kymmenjarj + (int(i)*2**indeksi)
indeksi = indeksi + 1
return kymmenjarj
print(kymmenen_binaariin(28))
print(binaari_kymmenen(11100))
Tuloste:
11100
28
Tapa 2.

Koodi:
def binaari_kymmenen(luku):
vastaus = int(str(luku), 2)
return vastaus
def kymmenen_binaariin(luku):
vastaus = bin(luku)
return vastaus
print(kymmenen_binaariin(28))
print(binaari_kymmenen(11100))
Tuloste:
0b11100
28
Tehtävä 3. Toteuta funktio, joka selvittää, onko luku alkuluku vai ei. Jos luku ei ole alkuluku funktio suorittaa toisen funktion, joka ratkaisee luvun tekijät.
Kokeile ovatko annetut luvut alkulukuja.
240
23
-1
Kokeile koodia halutessasi myös muilla numeroilla!
Esimerkki tulosteet:
Luku ei ole alkuluku ja on suurempi tai yhtä suuri kuin 2:
Luvun <luku> tekijät ovat [1, 2,…,n ].
Luku on alkuluku:
Luku <luku> on alkuluku
Luku ei ole alkuluku ja on pienempi kuin 2.
Luku <luku> ei ole alkuluku

Koodi
import math
def selvita_alkuluku(luku):
if luku < 2:
return f"Luku {luku} ei ole alkuluku"
else:
for i in range(2, int(math.sqrt(luku))+1):
if luku % i != 0:
return f"Luku {luku} on alkuluku"
else:
return luvun_tekijat(luku)
def luvun_tekijat(luku):
tekijat = []
for j in range(1, int(math.sqrt(luku))+1):
if luku % j == 0:
tekijat.append(j)
if j*j != luku:
tekijat.append(luku//j)
tekijat.sort()
return f"Luvun {luku} tekijät ovat {tekijat}."
print(selvita_alkuluku(240))
print(selvita_alkuluku(23))
print(selvita_alkuluku(-1))
Tuloste
Luvun 240 tekijät ovat [1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 16, 20, 24, 30, 40, 48, 60, 80, 120, 240].
Luku 23 on alkuluku
Luku -1 ei ole alkuluku
Tehtävä 4. Toteuta funktio, joka tulostaa näkyville jokaisen rivin jakoyhtälöstä ja palauttaa suurimman yhteisen tekijän.
Kokeile toimiiko koodi oikein ainakin luvuilla 1819 ja 867. Voit myös halutessasi kokeilla muitakin lukuja.
Esimerkki tuloste:
1819 = 867 * 2 + 85
867 = 85 * 10 + 17
85 = 17 * 5 + 0
Suurin yhteinen tekijä on 17 eli toiseksi viimeinen jakoyhtälön jakojäännös.

Koodi
def toteuttaa_jakoyhtalo(a, b):
r = a % b
jakojaannokset = []
while r != 0:
q = a // b
r = a % b
print(f"{a} = {b} * {q} + {r}")
a = b
b = r
jakojaannokset.append(r)
return f"Suurin yhteinen tekijä on {jakojaannokset[len(jakojaannokset)-2]} eli toiseksi viimeinen jakoyhtälön jakojäännös."
print(toteuttaa_jakoyhtalo(1819, 867))
Tuloste
1819 = 867 * 2 + 85
867 = 85 * 10 + 17
85 = 17 * 5 + 0
Suurin yhteinen tekijä on 17 eli toiseksi viimeinen jakoyhtälön jakojäännös.
