Ruby fundamentals through coding exercises
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.8 KiB

4 years ago
  1. ## 1 Alkuluvut
  2. **Tehtävä:**
  3. Alkuluvut ovat matemaattisessa mielessä mielenkiintoinen lukujoukko. Ne ovat lukuja, jotka ovat tasan jaollisia ainoastaan itsellään tai yhdellä (eli [alkuluku] % [muu kuin 1 tai itse]!= 0). Tämän ominaisuuden vuoksi ne ovat hyvin suosittuja osia esimerkiksi salausalgoritmeissa, koska niiden katsotaan olevan "turvallisempia" luku. Esimerkiksi 2, 3, 5 ,7 ,11, 13 ja 17 ovat alkulukuja, kun taas esimerkiksi 57 ei ole (jaollinen 3:lla), 1243645614636 ei myöskään (jaollinen 2:lla) jne. Ylipäänsä parilliset luvut eivät voi olla alkulukuja, koska ne ovat aina jaollisia itsensä ja yhden lisäksi 2:lla.
  4. Toinen mielenkiintoinen ominaisuus luvuissa on, että niiden ennustaminen on vaikeaa. Mitä pidemmälle luonnollisten kokonaislukujen joukossa mennään, sitä satunnaisemmin ja harvemmin vastaan tuleva luku on alkuluku. Itseasiassa näiden lukujen etsintä onkin aikaisemmin ollut eräänlainen kilpailumuoto supertietokoneiden kesken.
  5. Tässä vaiheessa ei varmaan ole vaikea arvata, että tarkoituksena on tehdä ohjelma, joka etsii alkulukuja. Tee siis ohjelma, joka aloittaa kokonaislukujen läpikäynnin luvusta 2, ja jatkaa siitä ylöspäin käyttäjän antamaan ylärajaan asti. Yläraja määräytyy kysymällä "Monenteenko lukuun asti etsitään?: ". Jos luku on jaollinen jollain aikaisemmin läpikäydyllä luvulla, tulostetaan "[luku] ei ole alkuluku.", jos taas ei ole, voidaan tulostaa "[luku] on alkuluku!".
  6. Ohjelmasta pystyy tekemään helposti sellaisen, että se jumittaa tietokoneen, koska siihen on helppo tehdä vahingossa useita sisäkkäisiä toistoja. Toteuta ohjelmasi kuitenkin siten, että se pystyy läpikäymään ensimmäiset 2500 lukua ilman isompia ongelmia. Toimiessaan oikein ohjelma tulostaa vaikkapa seuraavaa:
  7. Example output:
  8. ```
  9. Monenteenko lukuun asti etsitään?: 10
  10. 2 on alkuluku!
  11. 3 on alkuluku!
  12. 4 ei ole alkuluku.
  13. 5 on alkuluku!
  14. 6 ei ole alkuluku.
  15. 7 on alkuluku!
  16. 8 ei ole alkuluku.
  17. 9 ei ole alkuluku.
  18. ```
  19. **Vastaus**
  20. ```
  21. #!/usr/bin/env ruby
  22. # coding: utf-8
  23. def tarkistaSyote(kysymys, tyyppi, strip=false)
  24. begin
  25. print kysymys
  26. if strip
  27. syote = eval(tyyppi + "(gets.strip.chomp)")
  28. else
  29. syote = eval(tyyppi + "(gets.chomp)")
  30. end
  31. rescue ArgumentError
  32. warn "Syöttämäsi valinta ei ole kelvollinen"
  33. retry
  34. end
  35. return syote
  36. end
  37. ##########
  38. def onkoAlkuluku(luku)
  39. #if luku <= 1
  40. # puts "Syötteen tulee olla lukua 1 suurempi kokonaisluku. Annoit #{luku}"
  41. # return
  42. #end
  43. i = 2
  44. while i < luku
  45. if luku % i == 0
  46. return "#{luku} ei ole alkuluku."
  47. end
  48. i += 1
  49. end
  50. return "#{luku} on alkuluku!"
  51. end
  52. luku = tarkistaSyote("Monenteenko lukuun asti etsitään?: ", "Integer", true)
  53. i = 2
  54. while i < luku
  55. printf("%s\n", onkoAlkuluku(i))
  56. i += 1
  57. end
  58. ```