Форум » Обработка целых чисел » ege 25 №87 » Ответить

ege 25 №87

elpov06: 87) (К. Амеличев) Среди целых чисел, принадлежащих числовому отрезку [2945; 18294], найдите числа, не делящиеся на вторую степень какого-либо числа, кроме единицы. Ответом будет сумма цифр найденных чисел. Здравствуйте, не понимаю почему не сходится ответ, решаю перебором до квадратного корня, помогите пожалуйста. В ответе 7642289 [pre2] summa = 0 for ch in range(2945, 18295): for de in range(2, round(ch**0.5)): kv = de**2 if (ch % kv) != 0 : while ch > 0: y = ch % 10 ch=ch//10 summa =summa+y print(summa) [/pre2]

Ответов - 4

polyakovss: Здравствуйте, elpov06! В ответе не 7642289, а 177084. В условии задачи: ... найдите числа, не делящиеся на вторую степень какого-либо числа, кроме единицы. Вы неправильно реализуете это условие. Исправить Ваше решение можно, например, так:[pre2] def f(x): for de in range(2, round(x**0.5)+1): kv = de**2 if (x % kv) == 0 : return False return True summa = 0 for ch in range(2945, 18295): if f(ch): while ch > 0: y = ch % 10 ch //= 10 summa += y print(summa)[/pre2] Авторское решение: [pre2] start, end = 2945, 18294 def valid( x ): count = 2 while count*count <= x: if x % (count*count) == 0: return False count += 1 return True s = 0 for x in range( start, end+1 ): if valid(x): s += sum( map(int, str(x)) ) print( s ) [/pre2]

elpov06: Спасибо большое за ответ, только я не поняла чем отличаются Ваша и моя программа. Я поняла что алгоритм тот же. вы через функцию решали, а я через вложенный цикл. Не могу понять в чем отличие проверила по двум числам [pre2] ch=2555 summa=0 for de in range(2, round(ch**0.5)+1): kv = de**2 if (ch % kv) != 0 : while ch > 0: y = ch % 10 ch//=10 summa +=y print(summa) [/pre2] ответ 17 [pre2] def f(x): for de in range(2, round(x**0.5)+1): kv = de**2 if (x % kv) == 0 : return False return True summa = 0 ch=2555 if f(ch): while ch > 0: y = ch % 10 ch //= 10 summa += y print(summa) [/pre2] ответ 17 а если с циклом, то ответы не сходятся, но я не могу понять почему), напишите пожалуйста

polyakovss: Здравствуйте, elpov06! Вы пишете: Я поняла что алгоритм тот жеНет, это не так. Попробуйте, например, число 3008. Это число делится на 4, 16, 64. Поэтому summa для него должна быть равна 0. Для вашей программы это не так. Суть ошибки в том, что сумма должна увеличиваться, если рассматриваемое число не делится НИ НА ОДНУ вторую степень какого-либо числа, кроме единицы. В вашей программе сумма увеличивается, если число не делится НА ОДНУ ИЗ вторых степеней какого-либо числа, кроме единицы. Без использования функции задачу можно решить, например, так: [pre2] summa = 0 for ch in range(2945, 18295): flag = True for de in range(2, round(ch**0.5)+1): kv = de**2 if (ch % kv) == 0: flag = False break if flag: while ch > 0: y = ch % 10 ch //= 10 summa += y print(summa) [/pre2] P.S. Еще обратите внимание, что в вашей программе ch после цикла while обнуляется. Поэтому ряд проверок осуществляется неверно.


elpov06: Спасибо большое теперь поняла, что ни на одно число!!



полная версия страницы