» »

Najvecji skupni delitelj dveh ali vec stevil

Najvecji skupni delitelj dveh ali vec stevil

RatedR ::

Zdravo, imam tezavo pri pisanju enega odseka programa v Pythonu, poiskati moram skupnega delitelja dveh ali vec stevil, za zacetek bi za samo dva stevila.
Do zdaj sem probal poiskat delitelje, ze dolgo pa me muci problem, kako primerjat dva delitelja ko jih dobim ven:
stevilo = 99   #primer dveh nakljucnih stevil (najvecji skupni delitelj je 11)
stevilo2 = 55

i = 1
if stevilo > stevilo2:
    while i < stevilo/2:
        if stevilo%i == 0:
            print(i)
            
        if stevilo2%i == 0:
            print(i)
        i = i + 1

elif stevilo2 > stevilo:
    while i < stevilo2/2:
        if stevilo%i == 0:
            print(i)
            
        if stevilo%i == 0:
            print(i)
        i = i + 1

Izpis te kode je: 1,1,3,5,9,11,11,33
Prosim za pomoc/idejo. Hvala

OrkAA ::

Brute force resitev izgleda takole nekako:

#!/usr/bin/env python

stevila = [99, 55]
najmanjse_stevilo = min(stevila)

najvecji_skupni_delitelj = 1

for i in range(1, najmanjse_stevilo+1):
    uspesni = []
    for stevilo in stevila:
        if stevilo % i == 0:
            uspesni.append(True)
        else:
            uspesni.append(False)
    if all(uspesni):
        najvecji_skupni_delitelj = i

print najvecji_skupni_delitelj


Sicer pa za 2 stevila lahko uporabis evklidov algoritem:

a = 55
b = 99
while b:
    a, b = b, a%b
return a


Ce hoces isto stvar uporabit na spisku vecih stevil se bos moral poigrat z reduce funkcijo ali pa rekurzijo.

RatedR ::

A obstaja kakšna možnost, da bi na mojem primeru poskušal pomagat? Sem hvaležen za pomoč ampak ne razumem povsem tvoje kode ker sem še čisti začetnik. Hvala

OrkAA ::

Recimo takole:

stevilo = 99   #primer dveh nakljucnih stevil (najvecji skupni delitelj je 11)
stevilo2 = 55
 
i = 1
if stevilo < stevilo2:
    while i <= stevilo:
        if stevilo%i == 0 and stevilo2%i == 0:
            print(i)
        i = i + 1
 
elif stevilo2 < stevilo:
    while i <= stevilo2:
        if stevilo%i == 0 and stevilo2%i == 0:
            print(i)
        i = i + 1


Lahko pa poves cesa na moji kodi ne razumes, pa ti bom poskusal pomagat razumet.

Imas pa v svoji kodi kar nekaj logicnih napak.

if stevilo > stevilo2:
    while i < stevilo/2:


Tukaj se odlocis, da bos stel do vecjega stevila, kar nima smisla. Najvecji skupni delitelj ne more biti vecji od najmanjsega stevila.

while i < stevilo/2:


Ne vem zakaj stejes le do polovice stevila? Najvecji skupni delitelj je v nekaterih primerih lahko enak najmanjsemu stevilo. Naprimer pri stevilih 4 in 8 je najvecji skupni delitelj 4.

Zgodovina sprememb…

  • spremenil: OrkAA ()

Spura ::

RatedR ::

@OrkAA Hvala za pomoč, kodo razumem samo prave ideje nisem dobil prej.

Stel sem le do polovice, ker sem kot delitelje razumel to, da je najmanjse stevilo 2 s katerim lahko delis in dobis nekaj manj.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# program za pretvorbo v desetiško število z rekurzijo

Oddelek: Programiranje
81465 (1188) MrStein
»

NUJNO!Algoritmi C++

Oddelek: Pomoč in nasveti
211957 (1219) DOOM_er
»

[Raptor] Razcep na prafaktorje

Oddelek: Šola
242420 (1962) Math Freak
»

Naloga iz Putka - UPM

Oddelek: Programiranje
242208 (1544) NejcSSD
»

težave pri programiranju

Oddelek: Šola
131079 (870) gendale

Več podobnih tem