Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку - Компьютерные вопросы

Вопрос Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку

Регистрация
11 Май 2013
Сообщения
93
Репутация
0
Спасибо
0
Монет
0
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [248015; 251575] числа (в порядке возрастания) с нечётным количеством делителей, которые не делятся на 2. Для каждого такого числа выведите само число, количество его делителей и сумму его делителей

вот моя программа

for i in range(248015,251576):

a=[]

for d in range(1,i+1):

if i%d==0 and d%2!=0:

a.append(d)

if len(a)%2!=0:

print(i,len(a),sum(a))

правильно?почему у кого то выводит 2 числа, а у меня 5
 
Регистрация
7 Дек 2013
Сообщения
96
Репутация
0
Спасибо
0
Монет
0
269698437_1c3a20d30a9d22b3477a7bcf42671248_800.jpg

Вот правильная программа. По сути, должна теперь работать исправно
 
Регистрация
8 Мар 2013
Сообщения
80
Репутация
0
Спасибо
0
Монет
0
Сначала напиши функцию для поиска делителей def divs(x)
res = set()
for n in range(2, int(x ** 0.5) +1)
if x % n == 0
res.add(n)
res.add(x // n)
Return sorted(res)
# тут у тебя будут все нетривиальные делители
 
Регистрация
7 Май 2013
Сообщения
84
Репутация
1
Спасибо
1
Монет
0
Потому, что текст задачи неоднозначен.

Задачу можно трактовать несколькими способами: Число, имеющее только нечётные делители. И общее кол-во этих делителей нечётно. В этом случае в ответе действительно получаем 2 числа, т.к. такое число может быть только нечётным. Если ты заменишь range(248015,251576) на range(248015,251576,2), то получишь два числа.Число, имеющее любые делители, но кол-во нечётных делителей этого числа нечётно. В этом случае в ответе 5 чисел, т.к. помимо двух нечётных чисел есть ещё три чётных числа, имеющих нечётное кол-во нечётных делителей.
Во втором случае задачу можно трактовать ещё двумя способами: Надо вывести кол-во и сумму только нечётных делителей.Надо вывести кол-во и сумму всех делителей, включая чётные.
import math

def odd_divs(n): # возвращает только нечётные делители
while n % 2 == 0: n //= 2 # убираем все чётные делители
res = set()
for i in range(1, math.isqrt(n) + 1, 2):
if n % i == 0: res |= {i, n // i}
return res

# Вариант 1 (число имеет только нечётные делители)
for i in range(248015, 251576, 2):
d = odd_divs(i)
if len(d) % 2: print(i, len(d), sum(d))

# Вариант 2.1 (число может иметь любые делители; сумма и кол-во только нечётных делителей)
for i in range(248015, 251576):
d = odd_divs(i)
if len(d) % 2: print(i, len(d), sum(d)) Без функций: import math

for k in range(248015, 251576):
n = k
while n % 2 == 0: n //= 2
d = set()
for i in range(1, math.isqrt(n) + 1, 2):
if n % i == 0: d |= {i, n // i}
if len(d) % 2: print(k, len(d), sum(d)) import math

for n in range(248015, 251576, 2):
d = set()
for i in range(1, math.isqrt(n) + 1, 2):
if n % i == 0: d |= {i, n // i}
if len(d) % 2: print(n, len(d), sum(d))
 
Регистрация
4 Апр 2013
Сообщения
87
Репутация
0
Спасибо
1
Монет
0
Твоя программа имеет логическую ошибку: полный перебор делителей (for d in range(1, i+1)) делает её очень медленной и неэффективной. Разберёмся с корректным подходом.

Числа с нечётным количеством делителей
У числа нечётное количество делителей, если оно является полным квадратом (например, у 9 делители: 1, 3, 9 — всего 3). Значит, нужно искать нечётные полные квадраты в заданном диапазоне.

Почему у кого-то 2 числа, а у тебя 5?
Скорее всего, это связано с тем, что твоя программа перебирает ВСЕ нечётные делители и может учитывать их неправильно.

for x in range(int(248015**0.5), int(251575**0.5) + 1):
i = x * x
if 248015 <= i <= 251575 and i % 2 != 0: # Проверяем, что i нечётное и в диапазоне
divisors = [d for d in range(1, x + 1) if x % d == 0]
odd_divisors = set()
for d in divisors:
odd_divisors.add(d)
odd_divisors.add(i // d)
odd_divisors = {d for d in odd_divisors if d % 2 != 0} # Оставляем только нечётные
print(i, len(odd_divisors), sum(odd_divisors))

Перебираем только квадраты чисел в нужном диапазоне.
Отбрасываем чётные квадраты.
Определяем все нечётные делители числа.
Выводим: само число, количество его нечётных делителей и их сумму.
Если у кого-то выводит 2 числа, а у тебя 5, то, вероятно, он использовал более точную проверку. Попробуй этот код, он должен дать правильный результат.
 
Сверху Снизу