задача с счастливыми билетами
Всем привет, попалась задача на курсе по Python про счастливый билет. То есть программа должна проверять сумму первых трех цифр и последних трех цифр в числе. Я более менее сделал все, но! Если первой цифрой является 0, то последняя 4 становится 3. С другими цифрами такого не происходит. Узнал это из того, что выводил каждую цифру числа на экран.
Вот мой код:
a = int(input())
a1 = int(a/100000)
a2 = int((float(a/100000) - a1)* 10)
a3 = int((float(a/10000) - int(a/10000))*10)
a4 = int((float(a/1000) - int(a/1000))*10)
a5 = int((float(a/100) - int(a/100))*10)
a6 = int((float(a/10) - int(a/10))*10)код
if (a1 + a2 + a3) == (a4 + a5 + a6):
print('Счастливый')
else:
print('Обычный')
Вот код, как я узнал о проблеме:
a = int(input())
a1 = int(a/100000)
a2 = int((float(a/100000) - a1)* 10)
a3 = int((float(a/10000) - int(a/10000))*10)
a4 = int((float(a/1000) - int(a/1000))*10)
a5 = int((float(a/100) - int(a/100))*10)
a6 = int((float(a/10) - int(a/10))*10)
print(a1)
print(a2)
print(a3)
print(a4)
print(a5)
print(a6)
Ответы (2 шт):
Зачем все эти сложности? Вы пишите на python'e, так используйте его функционал.
a = [int(i) for i in input()]
if sum(a[:3]) == sum(a[3:]):
print('lucky ')
else:
print('unlucky')
Либо, если вы хотите оперировать именно числами
a = int(input())
sum_left = 0
sum_right = 0
for i in range(6):
if i<3:
sum_right += a // 10**i % 10
else:
sum_left += a // 10**i % 10
if sum_left == sum_right:
print('lucky')
else:
print('unlucky')
Кстати, если сравнить время работы этих двух методов, то выясниться, что 1-ый (который работает со строкой) почти в 1.3 раза быстрее 2-го (который работает с числами)
def solution1(s):
a = [int(i) for i in s]
return sum(a[:3]) == sum(a[3:])
def solution2(s):
a = int(s)
sum_left = 0
sum_right = 0
for i in range(6):
if i<3:
sum_right += a // 10**i % 10
else:
sum_left += a // 10**i % 10
return sum_left == sum_right
import random,string,time
def random_string(ln=6):
return ''.join(random.choice(string.digits) for i in range(ln))
for N in range(3,10):
print(' --- launch with data size 10^%s --- ' % N)
sample = [random_string() for i in range(10**N)]
start_time = time.time()
for i in sample:
solution1(i)
time_of_sol1 = (time.time() - start_time)*1000
print("solution #1: %s milliseconds" % time_of_sol1)
start_time = time.time()
for i in sample:
solution2(i)
time_of_sol2 = (time.time() - start_time)*1000
print("solution #2: %s milliseconds" % time_of_sol2)
if time_of_sol1<time_of_sol2:
print('solution #1 is %s times faster than solution #2' % (time_of_sol2/time_of_sol1))
else:
print('solution #2 is %s times faster than solution #1' % (time_of_sol1/time_of_sol2))
print('\n\n')
График зависимости времени от объема данных (по оси X степени 10), время в миллисекундах:
Исходя из вышесказанного, советую пользоваться методом работы со строками.
Не только 4 меняется на 3, но и 3 на 4. Неохота разбираться почему, наверняка из-за погрешностей двоичной арифметики.
Укорочу предыдущий ответ:
a = [int(i) for i in input()]
print(["unlucky","lucky"][sum(a[:3]) == sum(a[3:])])
