Project Euler - Problem 36

Project Euler - Problem 36

Avtor: Ana Rot

Navodilo, opis problema in ideja rešitve

Navodilo naloge

Problem 36

The decimal number, 585 = 10010010012 (binary), is palindromic in both bases. Find the sum of all numbers, less than one million, which are palindromic in base 10 and base 2. (Please note that the palindromic number, in either base, may not include leading zeros.)

Opis problema

Sestaviti moram program, ki bo pregledal vsa števila od ena do milijon in seštel tiste, ki so palindromi tako v desetiškem zapisu kot v dvojiškem zapisu. Da je število »palidrom« pomeni, da se bere z obeh strani enako (npr.: 1001001, 234432,...).

Ideja rešitve

Idejo vidim v tem, da najprej sestavim program, ki mi preveri ali je število palindrom in program, ki mi spremeni število iz desetiškega zapisa v dvojiški zapis in preveri ali je v dvojiškem zapisu palindrom. Nato pa še program, ki se bo skliceval na ta dva že sestavljena in bo seštel vsa števila do milijon, ki so palindrom tako v dvojiškem kot v desetiškem zapisu.

Algoritem in razlaga algoritma - 1.del

Algoritem:

def jePalindrom (st):
    '''Metoda nam preveri ali je dano število palindrom.'''
    niz = str(st)
    i = 0
    while i < len(niz)//2:
        if niz[i] != niz[-i-1]:
            return False
        i += 1
    return True

Razlaga algoritma:

  • Metoda »jePalindrom« najprej spremeni parameter, ki je podan kot število (int) v niz(str). To storim zato, ker je lažje spreminjati število v nizu in pregledati vse števke.
  • Števec »i« nastavim na nič.
  • Nastavim zanko while. Zanka se izvaja dokler je števec »i« strogo manjši od dolžine seznama, ki je celoštevilsko deljen z dva (). To pa zato, ker je dovolj, da pregledamo, če se polovica števila ujema z drugo polovico.
  • V zanki z if stavkom preverim če je prva števka v številu različna od zadnje.
  • Če je to res, takoj vrnemo logično vrednost False. To pomeni, da število ni palindrom. Če ni res se ne zgodi nič. Števec »i« povečamo.
  • Če se zanka konča, ne da bi se izvedel if stavek v njej, metoda vrne logično vrednost True, kar pomeni, da je podano število palindrom.

Algoritem in razlaga algoritma - 2.del

Algoritem:

def dvojiskiPalindrom(st):
    '''Metoda nam desetiško število spremeni v dvojiški in preveri ali je ta palindrom.'''
    niz = ''
    while st != 0:
        ostanek = st % 2
        niz += str(ostanek)
        st //= 2
    i = 0
    while i < len(niz)//2:
        if niz[i] != niz[-i-1]:
            return False
        i += 1
    return True

Razlaga algoritma:

  • V metodi »dvojiskiPalindorm« najprej podano število spremenim v dvojiški zapis, in nato preverim ali je to palindrom.
  • Najprej definiram prazen niz.
  • Naredim zanko wihle, ki se izvaja dokler je podano število različno od nič.
  • Dvojiško število dobim tako, da pogledam ostanek pri deljenu prvotnega števila z 2.
  • Te ostanke zapišem v definiran prazen niz pred zanko.
  • Število še celoštevilsko delim z dva.
  • Tako se zanka ponavlja dokler število ne pride na nič.
  • V nizu so sedaj shranjena števila, ki predstavljajo ostanke. To pa še ni dvojiški zapis števila. Zapisati bi ga bilo potrebno v obratnem vrstnem redu. Vendar ker me ne zanima konkretno to število, ampak samo ali je palindrom ali ne, to ni pomembno, saj se palindrom prebere z obeh strani enako.
  • Sedaj pa samo še preverim ali to je palindrom ali ne. To storim enako kot pri prejšnji metodi »jePalindrom«.

Algoritem in razlaga algoritma - 3.del

Algoritem:

import Euler

def sestejPalindrome():
    '''
    Metoda nam pregleda vsa števila od ena do miljon in nam sešteje tiste,
    ki so palindrom tako v desetiškem kot v dvojiškem zapisu.
    '''
    stevec = 0
    i = 0
    while i < 1000000:
        if Euler.jePalindrom(i) == True and Euler.dvojiskiPalindrom(i) == True:
            stevec += i
        i += 1
    return stevec

Razlaga algoritma:

  • Na koncu pa naredim metodo »sestejPalindrome()«, ki jo kličem brez parametrov. *Pred tem uvozim datoteko, kjer imam shranjeni prejšni dve metodi, saj si bom z njima pomagala. To je Euler.py.
  • Določim dve spremeniljivki, »stevec« in »i«, in jih nastavim na nič.
  • Naredim zanko while, ki se izvaja dokler je »i« strogo manjši od milijon, to pomeni da mi gre po vseh naravnih številih od ena do milijon.
  • V zanki nastavim stavek if, ki mi v primeru, da je število »i« palindrom v desetiškem in palindrom v dvojiškem, poveča števec za »i«.
  • Da je palindrom v desetiškem preverim z metodo »jePalindrom«, ki sem jo prej napisala. To storim tako, da najprej pokličem datoteko kamor sem jo shranila potem pa se ime metode in parameter, med njima pa naredim piko: Euler.jePalindrom(i), in enako stroim za preverjanje palindorma v dvojiškem zapisu.
  • Povečam števec »i«.
  • Na koncu vrnem števec. Ta števec je seštevek vseh števil v desetiškem zapisu, ki so palindromi tako v desetiškem kot v dvojiškem.

Povezava do Pythonove datoteke

Testni program

Mislm, da tukaj testni program ni potreben, saj je moja osnovna funkcija sestavljena tako, da uporabniku ni potrebno vnašati parametrov.

0%
0%