1

Тема: Вивести кількість досконалих чисел менших N.

Допоможіть будь-ласка вирішити цю задачу
Умова задачі:

Вивести кількість досконалих чисел менших N.

Формат вхідних даних
Дано натуральне число N (N<=30000).

Формат вихідних даних
Вивести кількість досконалих чисел.

Приклад вхідних даних
100
Приклад вихідних даних
2

Вот мій код

n=int(input())
mas=[]
s=0
k=0
if n>0:
    for i in range(1,n):
        if i%2==0:
            mas.append(int(i))
    for a in range(len(mas)):
        s=s+mas[a]
    if s==n:
        k=k+1
print(k)

2

Re: Вивести кількість досконалих чисел менших N.

Що з цим кодом не так? Якась помилка? Опишіть проблему повністю.

3

Re: Вивести кількість досконалих чисел менших N.

Виводить просто нуль

4

Re: Вивести кількість досконалих чисел менших N.

Точніше коли я ввожу 100 має вивести 2 але нічого не виводить, причина в тому що воно рахує всі парні числа, а не досконалі і додає їх в масив і в самому масиві додає всі ці числа, однак воно в масив має додавати лише досконалі числа і рахувати їхню кількість. До другої задачі з похожою умовою цей розв'язок підійшов

5 Востаннє редагувалося koala (12.12.2019 10:03:15)

Re: Вивести кількість досконалих чисел менших N.

Спершу розберіться, що саме у вас в масиві. Бо наразі там дільники не лише поточного числа, а й усіх попередніхякась дурня. Вирівняйте код (слова for і if не треба відсувати, тільки наступний після двокрапки рядок) і дайте змінним людські імена.

В принципі, вам і масив тут не дуже потрібен; але в будь-якому разі вам треба продумати, що саме ви робите, перед тим, як кодити.

6 Востаннє редагувалося koala (12.12.2019 14:26:29)

Re: Вивести кількість досконалих чисел менших N.

Займемося декомпозицією.

#Вивести кількість досконалих чисел менших N.
#вводимо n
#створюємо лічильник
#для всіх i<n перевіряємо, якщо число i досконале - збільшуємо лічильник
#виводимо лічильник
#вводимо n
n = int(inpiu())
#створюємо лічильник
perfect_numbers = 0
#для всіх i<n 
for i in range(1,n):
      #перевіряємо на досконалість
      #якщо число i досконале 
      if число досконале
               #- збільшуємо лічильник
               perfect_numbers += 1
#виводимо лічильник
print(perfect_numbers)

Тепер згадуємо визначення досконалого числа. Нам знадобиться ще одна змінна для суми дільників.

#вводимо n
n = int(inpiu())
#створюємо лічильник
perfect_numbers = 0
#для всіх i<n 
for i in range(1,n):
      #перевіряємо на досконалість
      divisors_sum = 0
      #для всіх дільників від 1 до i (без i)
      for divisor in range(1,i):
          #якщо divisor є дільником i
          if i%divisor == 0:
               #збільшуємо суму
               divisors_sum += divisor
       #якщо число i досконале 
       if divisors_sum == i
               #- збільшуємо лічильник
               perfect_numbers += 1
#виводимо лічильник
print(perfect_numbers)

Приблизно так. Це якщо без оптимізації.
Ну, або ж
print(sum(1 for i in range(1,int(input())) if sum(d for d in range(1,i) if i%d==0)==i))
якщо любите все в один рядок пхати.

Подякували: xZartsust1

7 Востаннє редагувалося /KIT\ (12.12.2019 14:29:01)

Re: Вивести кількість досконалих чисел менших N.

В коді Коали помилка: треба збільшувати divisors_sum не на 1, а на divisor. Однорядкове рішення з синтаксичною помилкою.
Ось мій розв'язок:

#Практично теж саме рішення, що і у Коали, тільки виправлене
N = int(input())
perfect = 0
for i in range(1,N):
    counter = 0
    for x in range(1,i):
        if i%x == 0:
            counter += x
    if counter==i:
        perfect += 1
print(perfect)

#Однорядкове рішення в стилі ФП. Не зтискав.
print(sum(map(lambda i:sum(filter(lambda x:not i%x,range(1,i)))==i,range(1,int(input())))))

#Якщо трохи зтиснути, то отак:
print(sum(i==sum(filter(lambda x:i%x<1,range(1,i)))for i in range(1,int(input()))))
Подякували: xZartsust1

8

Re: Вивести кількість досконалих чисел менших N.

Дякую, виправив :)
Оптимізований варіант:

n = int(input())
perfect_numbers = 0
for i in range(2,n): #1 не перевіряємо, щоб не заплутатися
    divisors_sum = 1 #на 1 ділиться все
    for divisor in range(2,int(i**.5)+1): #немає сенсу перевіряти числа, більші за корінь - у них другий множник менший за корінь
        div, mod = divmod(i, divisor) #частка і залишок
        if mod == 0:
            divisors_sum += divisor
            if div!=mod: #якщо число i ділиться на divisor, то і на i/divisor теж
                divisors_sum += div
    if divisors_sum == i:
        perfect_numbers += 1
print(perfect_numbers)
Подякували: xZartsust1

9

Re: Вивести кількість досконалих чисел менших N.

Можна також починати перевіряти не з 2, а з 6, бо 6 - це найменше досконале число

10 Востаннє редагувалося koala (12.12.2019 15:14:28)

Re: Вивести кількість досконалих чисел менших N.

/KIT\ написав:

Можна також починати перевіряти не з 2, а з 6, бо 6 - це найменше досконале число

Та їх усього 30 штук відомо, можна і захардкодити.
З 1 я починаю, бо якщо розкладати число на пари доповнених множників, то будуть проблеми з повними квадратами (тому зайвий if всередині) і з парою 1*i=i - з неї треба враховувати лише 1; а при n=1 не треба враховувати взагалі нічого, і це треба або ускладнювати умову (додавати div, крім випадків 1 чи div*div=i), або одразу починати з 2.

Подякували: /KIT\, xZartsust, leofun013