Автор | Сообщение |
|
Отправлено: 28.08.21 04:03. Заголовок: ege 25 №87
87) (К. Амеличев) Среди целых чисел, принадлежащих числовому отрезку [2945; 18294], найдите числа, не делящиеся на вторую степень какого-либо числа, кроме единицы. Ответом будет сумма цифр найденных чисел. Здравствуйте, не понимаю почему не сходится ответ, решаю перебором до квадратного корня, помогите пожалуйста. В ответе 7642289 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)
|
|
|
Ответов - 4
[только новые]
|
|
|
Отправлено: 28.08.21 20:42. Заголовок: Ответ
Здравствуйте, elpov06! В ответе не 7642289, а 177084. В условии задачи: ... найдите числа, не делящиеся на вторую степень какого-либо числа, кроме единицы. Вы неправильно реализуете это условие. Исправить Ваше решение можно, например, так: цитата: | 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) |
|
Авторское решение: цитата: | 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 ) |
|
|
|
|
|
Отправлено: 30.08.21 15:25. Заголовок: Спасибо большое за о..
Спасибо большое за ответ, только я не поняла чем отличаются Ваша и моя программа. Я поняла что алгоритм тот же. вы через функцию решали, а я через вложенный цикл. Не могу понять в чем отличие проверила по двум числам 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) ответ 17 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) ответ 17 а если с циклом, то ответы не сходятся, но я не могу понять почему), напишите пожалуйста
|
|
|
|
Отправлено: 30.08.21 18:27. Заголовок: Ответ
Здравствуйте, elpov06! Вы пишете: цитата: | Я поняла что алгоритм тот же |
| Нет, это не так. Попробуйте, например, число 3008. Это число делится на 4, 16, 64. Поэтому summa для него должна быть равна 0. Для вашей программы это не так. Суть ошибки в том, что сумма должна увеличиваться, если рассматриваемое число не делится НИ НА ОДНУ вторую степень какого-либо числа, кроме единицы. В вашей программе сумма увеличивается, если число не делится НА ОДНУ ИЗ вторых степеней какого-либо числа, кроме единицы. Без использования функции задачу можно решить, например, так: цитата: | 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) |
| P.S. Еще обратите внимание, что в вашей программе ch после цикла while обнуляется. Поэтому ряд проверок осуществляется неверно.
|
|
|
|
Отправлено: 31.08.21 05:18. Заголовок: Спасибо большое тепе..
Спасибо большое теперь поняла, что ни на одно число!!
|
|
|
|