@Eclipse_the_moon

Пишу код для счастливых билетов, но в коде что-то не то и циклы не работают после 000000, в чём проблема?

Я пишу код для генерации билетов(6 значных) и проверке на "счастливый билет" а так же вывод счастливых билетов но в коде что-то не то и циклы не работают после 000000. а вот и сам код:
int(input('Введите количество счастливых билетов'))
stop = 0
print("0"" ""0"" ""0"" ""0"" ""0"" ""0")
z1 = 0
z2 = 0
z3 = 0
z4 = 0
z5 = 0
z6 = 0
ticket = [z1,z2,z3,z4,z5,z6]

while True:
while z1<10:
z1 = z1 + 1
if z1 ==9:
z1 = 0
if z1<9:
z1+=1
print(ticket)

while z2 < 10:
z2 += 1
if z2 ==9:
z2 = 0
if z2<9:
z2+=1
print(ticket)
while z3<10:
z3 += 1
if z3 ==9:
z3 = 0
if z3<9:
z3+=1
print(ticket)
while z4<10:
z4 += 1
if z4 ==9:
z4 = 0
if z4<9:
z4+=1
print(ticket)
while z5<10:
z5 += 1
if z5 ==9:
z5 = 0
if z5<9:
z5+=1
print(ticket)
while z6<10:
z6 += 1
if z6 ==9:
z6 = 0
if z6<9:
z6+=1
print(ticket)
print(ticket)
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Во-первых, у тебя уехали циклы, начиная с о второй цифры. Они не внутри общего цикла.
Далее, ты можешь заменить 6 циклов на один, просто по числам от 0 до 999999.
for number in range(0, 1_000_000):
    str_number = f'{number:0>6}' # превращаем число в строку, добивая нулями слева до 6 знаков
    digits = list(map(int, str_number))  # каждый символ строки превращаем в отдельное число, т.е. цифру
    d1, d2, d3, d4, d5, d6 = digits  # распаковываем список цифр в отдельные переменные


Ещё ты можешь перебирать первые 5 цифр, а шестую цифру вычислять - сумма первых трёх минус четвёртая и минус пятая . Если результат в диапазоне 0-9, то это и будет шестая цифра.

Если же ты предпочтёшь перебирать 5 цифр отдельными циклами, то стоит делать иначе.
Первые 3 цифры перебираешь полным циклом, 4я цифра не должна превышать сумму первых 3х, 5я цифра не должна превышать сумму первых 3х - 4ю цифру. 6ю цифру вычислишь.
for d1 in range(10):
    for d2 in range(10):
        for d3 in range(10):
            for d4 in range(min(9, d1+d2+d3) + 1):
                for d5 in range(min(9, d1 + d2 + d3 - d4) + 1):
                    d6 = d1 + d2 + d3 - d4 - d5
                    if 0 <= d6 <= 9:
                        print(f'{d1}{d2}{d3}{d4}{d5}{d6}')


Аналогично, можно заметить, что не всегда имеет смысл перебирать 4-5 цифры с нуля. Пример: если первые три цифры 299, то четвёртая не может быть 0 или 1 - в этом случае оставшиеся две цифры должны будут дать в сумме 20 или 19, что невозможно. С учётом код изменится так:
for d1 in range(10):
    for d2 in range(10):
        for d3 in range(10):
            min_d4 = max(0, d1 + d2 + d3 - 18)
            max_d4 = min(9, d1 + d2 + d3)
            for d4 in range(min_d4, max_d4 + 1):
                min_d5 = max(0, d1 + d2 + d3 - d4 - 9)
                max_d5 = min(9, d1 + d2 + d3 - d4)
                for d5 in range(min_d5, max_d5 + 1):
                    d6 = d1 + d2 + d3 - d4 - d5
                    if 0 <= d6 <= 9:
                        print(f'{d1}{d2}{d3}{d4}{d5}{d6}')
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
GavriKos
@GavriKos
while True:

Так а где прерывание этого цикла?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы