Как упростить код (подсчёт цифр из которых состоит число)?
Целью задачи является выведение числа всех цифр из которого состоит число.
Возможно ли как-то упростить/сократить данный код ?
n=int(input("Введите число: "))
q0=0
q1=0
q2=0
q3=0
q4=0
q5=0
q6=0
q7=0
q8=0
q9=0
while n>0:
f=n%10
n=n//10
print(n,f)
if f==0:
q0=q0+1
elif f==1:
q1=q1+1
elif f==2:
q2=q2+1
elif f==3:
q3=q3+1
elif f==4:
q4=q4+1
elif f==5:
q5=q5+1
elif f==6:
q6=q6+1
elif f==7:
q7=q7+1
elif f==8:
q8=q8+1
elif f==9:
q9=q9+1
else:
print("Цикл окончен")
print("Итого число состоит из",q0, "нолей,",q1, "единиц,",q2, "двоек,",q3, "троек,",q4, "четверок,",q5, "пятерок,",q6, "шестерок,",q7, "семерок,",q8, "восьмерок,",q9, "девяток")
Ответы (2 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
Переменные от q0
до q9
заменим на список из десяти элементов q
:
n=int(input("Введите число: "))
q = [0] * 10
while n>0:
f=n%10
n=n//10
print(n,f)
if f==0:
q[0]=q[0]+1
elif f==1:
q[1]=q[1]+1
elif f==2:
q[2]=q[2]+1
elif f==3:
q[3]=q[3]+1
elif f==4:
q[4]=q[4]+1
elif f==5:
q[5]=q[5]+1
elif f==6:
q[6]=q[6]+1
elif f==7:
q[7]=q[7]+1
elif f==8:
q[8]=q[8]+1
elif f==9:
q[9]=q[9]+1
else:
print("Цикл окончен")
print("Итого число состоит из",q[0], "нолей,",q[1], "единиц,",q[2], "двоек,",q[3], "троек,",q[4], "четверок,",q[5], "пятерок,",q[6], "шестерок,",q[7], "семерок,",q[8], "восьмерок,",q[9], "девяток")
Выражения вида q[2]=q[2]+1
можно заменить на q[f]=q[f]+1
. Во всех ветках выражение одно и то же. То есть разные ветки не нужны:
n=int(input("Введите число: "))
q = [0] * 10
while n>0:
f=n%10
n=n//10
print(n,f)
q[f]=q[f]+1
else:
print("Цикл окончен")
print("Итого число состоит из",q[0], "нолей,",q[1], "единиц,",q[2], "двоек,",q[3], "троек,",q[4], "четверок,",q[5], "пятерок,",q[6], "шестерок,",q[7], "семерок,",q[8], "восьмерок,",q[9], "девяток")
Разбираемся с последним print
. Там сложно, но можно:
n=int(input("Введите число: "))
q = [0] * 10
while n>0:
f=n%10
n=n//10
print(n,f)
q[f]=q[f]+1
else:
print("Цикл окончен")
names = [
"нолей,", "единиц,", "двоек,", "троек,", "четверок,",
"пятерок,", "шестерок,", "семерок,", "восьмерок,", "девяток"
]
print("Итого число состоит из", end=" ")
for i in range(10):
print(q[i], names[i], end=" ")
print()
Я бы убрал нули из печати и причесал бы код:
n = int(input("Введите число: "))
q = [0] * 10
while n > 0:
n, f = divmod(n, 10)
q[f] += 1
names = [
"нолей", "единиц", "двоек", "троек", "четверок",
"пятерок", "шестерок", "семерок", "восьмерок", "девяток"
]
parts = []
for d, n in zip(q, names):
if d > 0:
parts.append(f"{d} {n}")
print("Итого число состоит из", ", ".join(parts))
Само число не нужно, проще работать со строкой-изображением числа:
import collections
c = collections.Counter(input("Введите число: "))
names = [
"нолей", "единиц", "двоек", "троек", "четверок",
"пятерок", "шестерок", "семерок", "восьмерок", "девяток"
]
parts = []
for i, n in enumerate(names):
q = c[str(i)]
if q > 0:
parts.append(f"{q} {n}")
print("Итого число состоит из", ", ".join(parts))
Осталось сделать склонения, "1 единиц" выглядит плохо.
Автор решения: AnnaBazueva
→ Ссылка
Решение со склонением и игнорированием цифр отсутствующих в числе:
_, __, ___ = (1,), (2, 3, 4), (5, 6, 7, 8, 9, 0)
d = {"0": {_: "ноль", __: "ноля", ___: "нолей"},
"1": {_: "единица", __: "единицы", ___: "единиц"},
"2": {_: "двойка", __: "двойки", ___: "двоек"},
"3": {_: "тройка", __: "тройки", ___: "троек"},
"4": {_: "четвёрка", __: "четвёрки", ___: "четвёрок"},
"5": {_: "пятёрка", __: "пятёрки", ___: "пятёрок"},
"6": {_: "шестёрка", __: "шестёрки", ___: "шестёрок"},
"7": {_: "семёрка", __: "семёрки", ___: "семёрок"},
"8": {_: "восьмёрка", __: "восьмёрки", ___: "восьмёрок"},
"9": {_: "девятка", __: "девятки", ___: "девяток"}
}
f = lambda c, v: (v[_] if c % 10 in _ and (c == 1
or
(c > 11 and str(c)[-2:] != "11")
)
else v[__] if c % 10 in __ and (c < 5 or c > 15)
else v[___]
)
n = input("Введите число: ")
prep = (f'{(c := n.count(k))} {f(c,v)}' for k, v in d.items())
print("Число состоит из:\n "
f"{',\n '.join((p for p in prep if "0" not in p))}."
)
output:
Введите число: 01234545599999
Число состоит из:
1 ноль,
1 единица,
1 двойка,
1 тройка,
2 четвёрки,
3 пятёрки,
5 девяток.