Программа не читает один из делителей(питон)
Cовершенным называется число, равное сумме всех своих делителей, строго меньших его самого. Например, число 6 является совершенным, так как 6 = 1 + 2 + 3. На вход программе подаётся натуральное число N, определите, является ли оно совершенным.
Формат входных данных На вход программе подаётся натуральное число N.
Формат выходных данных Если число N является совершенным, выведите строку "Число N является совершенным". В противном случае выведите строку "Число N не является совершенным". Конечно же, вместо символа "N" должно быть выведено само число.
Sample Input 1:
6
Sample Output 1:
Число 6 является совершенным
Sample Input 2:
37
Sample Output 2:
Число 37 не является совершенным
есть код к этой задаче:
N = int(input())
i = 1
a = 0
while i * i <= N:
if N % i == 0:
a += i
if i != N // i:
a += N // i
i += 1
if N == a:
print("Число " + str(N) + " является совершенным")
else:
print("Число " + str(N) + " не является совершенным")
прога не читает 1 как делитель, как это исправить?
Ответы (2 шт):
- Непонятно для чего вы используете эти строки:
if i != N // i:
a += N // i
- У вас неверное условие в цикле.
- Проще использовать цикл
for:
N = int(input())
a = 0 # сумма делителей
for i in range(1, N):
if N%i == 0:
a += i
# вывод
- Если нужен именно
while:
N = int(input())
a = 0 # сумма делителей
i = 1
while i<N:
if N%i == 0:
a += i
i+=1
# вывод
"Однострочник"
N = int(input())
print(f'Число {N} ', '' if N==sum(i for i in range(1, N) if not N%i) else 'не ', 'является совершенным.'
В этом коде есть некоторые неточности:
N = int(input())
i = 1
a = 0
while i * i <= N: # Здесь идёт проверка делителей данного числа до его корня.
if N % i == 0:
a += i
if i != N // i: # Здесь мы проверяем не является ли i корнем N
a += N // i # (i != N // i) => i * i != N
i += 1
if N == a:
print("Число " + str(N) + " является совершенным")
else:
print("Число " + str(N) + " не является совершенным")
Допустим если взять число 36, то его корень - это 6, но у данного числа есть делители большие 6 - это 9, 12, 18 - мы видим, что делители числа доходят до его половины включительно.
Вот исправленный код:
N = int(input())
i = 1
a = 0
while i * 2 <= N: # Делители числа не больше его половины
if N % i == 0:
a += i
i += 1
if N == a:
print("Число " + str(N) + " является совершенным")
else:
print("Число " + str(N) + " не является совершенным")