Program u python - u

Radim neki program (nevezano za petlju) i u njemu se traži ispisati broj koji ima najveći zbir cifara, prethodno su uneta tri broja. Medjutim, kad se program ispisuje u konzoli, na tom delu zastane i nikad se ne dovrši do kraja. Nekad se čak i dovrši al ispiše potpuno drugi broj. Ovo sam pokušavao i nikad neće da izvrši kako treba.

while x > 0 and y >0 and z>0:
zbcifara_x += x % 10
x = x // 10
zbcifara_y += y % 10
y = y // 10
zbcifara_z += z % 10
y = y // 10

while max(x,y,z) > 0:
zbcifara_x += x % 10
x = x // 10
zbcifara_y += y % 10
y = y // 10
zbcifara_z += z % 10
y = y // 10

i na kraju ide par uslova za ispitivanje u koliko je najveca suma cifara x onda reci da ima x najviše itd itd… Čak bih voleo da čujem ideje za unos neograničenog broja brojeva sve dok se ne pritisne enter, da ih sve obradi i na kraju odradi potrebno. U zadatku se takodje tražilo i koji brojevi počinju i završavaju se istom cifrom.
Ovo je ceo program.

x, y, z = map(int, input().split())
kopija_xx = x
kopija_yy = y
kopija_zz = z
kopija_x = str(x)
kopija_y = str(y)
kopija_z = str(z)
zbcifara_x = 0
zbcifara_y = 0
zbcifara_z = 0

brojevi = [kopija_x,kopija_y,kopija_z]
lista_takvih = []

for i in range(len(brojevi)):
if brojevi[i][0] == brojevi[i][len(brojevi[i]) - 1]:
lista_takvih.append(brojevi[i])

print()
if len(lista_takvih) == 0:
print(“Nema brojeva koji imaju istu početnu i završnu cifru”)
else:
print("Brojevi koji imaju istu početnu i završnu cifru su: ", end = " " )
for i in lista_takvih:
print(i, end = " ")

print("\nNajveći od njih je: “, max(x,y,z), “a najmanji”, min(x,y,z))
print(”\nNjihov zbir je: ", x + y+ z)
maksimalan = max(x,y,z)
while maksimalan > 0:
zbcifara_x += x % 10
x = x // 10
zbcifara_y += y % 10
y = y // 10
zbcifara_z += z % 10
y = y // 10
if max(zbcifara_x ,zbcifara_y ,zbcifara_z) == zbcifara_x:
print("Najveći zbir cifara ima: ", kopija_xx, “i to je”, zbcifara_x )
elif max(zbcifara_x ,zbcifara_y ,zbcifara_z) == zbcifara_y:
print("Najveći zbir cifara ima: ", kopija_yy, “i to je”, zbcifara_y )
else:
print("Najveći zbir cifara ima: ", kopija_zz, “i to je”, zbcifara_z )

Plan je otprilike da se deo programa izvršava sve do se ne zadovolji najveći ili sve dok poslednji ne dodje do nule.

I kod je malo pokvaren u prikazu na petlji, u realnosti nije takav.

Ne kontam kako koji brojevi pocinju i zavrsavaju se istom cifrom?
(sad cu napraviti neo kod ali za najveci a ovo ne kontam)

1 Like

To sa istom cifrom se misli na recimo 431674 ili 1231, al to nije problem to sam rešio preko lista, a može i razne druge načine, nego dao sam ceo program da se taj koji čita ne bi čudio da možda nisam oštetio promenljivu pre petlje pa onda neće zato.

Deo gde se traži zbir cifara misli se recimo na unet broj12735, i njegov zbir cifara je 1+2+7+3+5, pa onaj čiji je zbir najveći da ga ispiše. Ja program mogu rešiti da svaki broj ima svoj ciklus al ja oću da sve brojeve ubacim u jedan.

zbcifara_y += y % 10
y = y // 10
zbcifara_z += z % 10
y = y // 10

U oba slucaja delis y sa 10 (umesto z u poslednjem redu), pa z ne padne nikad na nulu i dobijes beskonacnu petlju.

Evo najblji za zbir cif ako sam dobro razumeo:
l = input().split()
x = “”
for i in sorted(l):
x = i+x
print(x)

1 Like

Najbolji

1 Like

ispravio sam i opet ne radi

Sad sam pogledao kompletan program, koliko vidim ovo sto radis nije bas isto kao opcije (1) i (2):

maksimalan = max(x, y, z)
while maksimalan > 0:
    # ...

U telu petlje nikad ne menjas vrednost maksimalan, tako da se nece zavrsiti – pretpostavljam da je ideja da radis nesto kao while max(x, y, z) > 0?

Alternativno, malo je logicnije da odvojeno saberes cifre x, y i z (sa tri petlje) umesto sve u jednoj petlji. Tvoj program izgleda ok, ali ako brojevi nemaju isti broj cifara za krace sabiras “vodece nule”, sto ne menja rezultat ali nije bas najjasnije (a ni potrebno).

1 Like

Da, ideja je prvo bila da se ciklus izvršava sve dok sve tri vrednosti ne dodju na nulu, a drugi način da se ciklus izvršava sve dok najveći od njih ne dodje na nulu, što i ima smisla jer će se njihove vrednosti stalno menjati za //10 i onaj koji je bio najveći ostaje najveći. Medjutim petlje se beskonačno dugo izvršavaju i sad treba odgonetnuti koje vrednosti se ne menjaju ili nikad ne dodju na nulu.

Ideja da se izvrsava dok sve tri ne dodju na nulu (sto je ekvivalentno sa time da najveci dodje na nulu) je sasvim na mestu, problem je samo sto tvoja implementacija zapravo ovo ne testira jer se vrednost maksimalan ne racuna ponovo svaku iteraciju vec proveravas da li je stara vrednost, pre nego sto se brojevi smanje, manja od nule.

Konkretno, nedostaje nesto kao

maksimalan = max(x, y, z)
while maksimalan > 0:
    zbcifara_x += x % 10
    x = x // 10
    # ... isto y, z
    maksimalan = max(x, y, z)  # <-- sada kada su se x, y, z smanjili treba nam nova vrednost

Alternativno, umesto da cuvas maksimum u promenljivoj, petlja moze da bude while max(x, y, z) > 0.