Найти совершенные числа

Задача

Найти все совершенные числа до 10000. Совершенное число - это такое число, которое равно сумме всех своих делителей, кроме себя самого. Например, число 6 является совершенным, т.к. кроме себя самого делится на числа 1, 2 и 3, которые в сумме дают 6.

Пояснение к задаче и алгоритм решения

В цикле, перебирая натуральные числа до 10000,

  1. присвоить переменной, в которой будет накапливаться сумма делителей, 0.
  2. В цикле от 1 до половины текущего натурального числа
    1. пытаться разделить исследуемое число нацело на счетчик внутреннего цикла.
    2. Если делитель делит число нацело, то добавить его к переменной суммы делителей.
  3. Если сумма делителей равна исследуемому натуральному числу, то это число совершенно и следует вывести его на экран.

Исходный код на языке программирования Pascal

var
    i,j,s: word;
begin
    for i := 1 to 10000 do begin
        s := 0;
        for j:=1 to i div 2 do
            if i mod j = 0 then
                s := s+j;
        if s = i then
            write(i,' ');
    end;
    writeln;
end.

Пример(ы) выполнения программы на языке Pascal

6 28 496 8128

Исходный код на языке программирования C

#include <stdio.h>
main() {
    int i,j,s,l;
    for (i=2; i<10000; i++) {
        s = 0;
        for (j=1; j < i; j++)
            if (i%j == 0)
                s += j;
        if (s == i)
            printf("%d\n", i);
    }
}

Особенности решения на языке программирования C

Если i поделить на 2, то программа работает неправильно. В Питоне такая же проблема.

Исходный код на языке программирования Python

for i in range(2,10000):
    s = 0
    for j in range(1,i):
        if i%j == 0:
            s += j
    if s == i:
        print(i)

Особенности решения на языке программирования Python

см. язык Си.

Исходный код на языке программирования КуМир

алг совершенные числа
нач
  цел i,j,s
  нц для i от 1 до 1000
    s := 0
    нц для j от 1 до div(i,2)
      если mod(i,j) = 0 то
        s := s + j
      все
    кц
    если s = i то
      вывод i, " "
    все
  кц
кон

Особенности решения задачи в среде КуМир

Невероятно долгий поиск даже до 1000.

Исходный код на языке программирования Basic

for i=2 to 10000
        s = 0
        for j=1 to i\2
                if i%j = 0 then s = s + j
        next j
        if s = i then print i
next i

Пример(ы) выполнения программы на языке Basic

6
28
496
8128

Тема

Вложенные циклы

Уровень сложности

Средний

Дата публикации

Комментарий

Есть намного более быстрые реализации поиска. Плюс если действовать вашим методом, то оптимизированный код выглядит так:

m, n = list(map(int, input().split()))
for i in range(m, n+1):
    s = 1
    for j in range(2, i/2):
        if i % j == 0:
            s += j
    if s == i:
        print(i)