Число считается совершенным, если оно равно сумме своих делителей, исключая себя самого. Для проверки, является ли число N совершенным, полагаем будущую сумму делителей равной 1 (на единицу число всегда делится) и последовательно делим N на числа, начиная от 2 и заканчивая N/2. Если число делится без остатка на очередной делитель, добавляем его к сумме. После завершения цикла делений сравниваем сумму с N и в случае равенства объявляем число N совершенным. В начале алгоритма проверяем, чтобы N было больше 1, в противном случае сразу объявляем число не совершенным.
var i,n,s:longint; begin Write('Введите натуральное число: '); Read(n); if n=1 then Writeln('Число 1 не является совершенным') else begin s:=1; for i:=2 to (n div 2) do if (n mod i)=0 then s:=s+i; if s=n then Writeln('Число является совершенным') else Writeln('Число не является совершенным') end end.
Тестовое решение: Введите натуральное число: 33550336 Число является совершенным
Введите натуральное число: 543252 Число не является совершенным
По определению совершенным числом называется то число, которое равно сумме своих делителей отличных от самого числа. Значит,чтобы решить задачу нам нужно найти сумму делителей числа и проверить равна ли она самому числу. var sum, N, i:integer; begin readln(N);//читаем число с клавиатуры //Проверяем делатели до N-1, т.к. нам нужны делители не равные //самому числу for i:=1 to N-1 do if N mod i = 0 then//Если i является делителем N, то... sum:=sum+i;// ...прибавляем его к сумме делителей // Проверяем равна ли сумма делителей числа самому числу. if sum = N then writeln('Число совершенное') else writeln('Число не совершенное'); end.
Function Check(a : Integer) : Boolean; Var i,s : Integer; Begin s:=0; For i:=1 to a-1 do If a mod i=0 then s:=s+i; Check:=s=a; end; Var N : Integer; Begin Readln(N); Writeln(Check(N)); end.
Совершенное число - натуральное число, равное сумме всех своих собственных делителей (то есть всех положительных делителей, отличных от самого числа).
//Pascal var n, s, i: integer;
begin s := 0; readln(n); // Находим делители до n-1, увеличиваем сумму s на i, // если i - делитель введенного числа for i := 1 to n - 1 do if n mod i = 0 then s := s + i;
if s = n then writeln('cовершенное') else writeln('не совершенное'); end.
Если число делится без остатка на очередной делитель, добавляем его к сумме. После завершения цикла делений сравниваем сумму с N и в случае равенства объявляем число N совершенным. В начале алгоритма проверяем, чтобы N было больше 1, в противном случае сразу объявляем число не совершенным.
var
i,n,s:longint;
begin
Write('Введите натуральное число: '); Read(n);
if n=1 then Writeln('Число 1 не является совершенным')
else begin
s:=1;
for i:=2 to (n div 2) do
if (n mod i)=0 then s:=s+i;
if s=n then Writeln('Число является совершенным')
else Writeln('Число не является совершенным')
end
end.
Тестовое решение:
Введите натуральное число: 33550336
Число является совершенным
Введите натуральное число: 543252
Число не является совершенным
var
sum, N, i:integer;
begin
readln(N);//читаем число с клавиатуры
//Проверяем делатели до N-1, т.к. нам нужны делители не равные
//самому числу
for i:=1 to N-1 do
if N mod i = 0 then//Если i является делителем N, то...
sum:=sum+i;// ...прибавляем его к сумме делителей
// Проверяем равна ли сумма делителей числа самому числу.
if sum = N then
writeln('Число совершенное')
else
writeln('Число не совершенное');
end.
using namespace std;
bool perfect_number(int n)
{
int res = 1;
for (int i = 2; i * i <= n; ++i)
if (n % i == 0)
res += i + n / i;
return res == n?1:0;
}
int main()
{
int n;
cin >> n;
cout << perfect_number(n)?"YES":"NO";
}
def check_perfect(number:int, dividers = []):
for i in range(1, number):
if number%i == 0:
dividers.append(i)
if sum(dividers) == number:
return 1
def get_div(num, div = []):
for i in range(1, num):
if num%i == 0:
div.append(i)
return div
def main():
number = int(input())
if check_perfect(number):
print(' '.join(str(num) for num in get_div(number)))
else:
print(0)
if __name__ == '__main__':
main()
Объяснение:
На случай, если сайт сломает табуляции в коде (А он их сломает), ниже представлен скриншот оригинала кода. Программа протестирована.
var n,z,n1,e:integer;
begin
e:=0;
readln(n);
n1:=n div 2;
for z:=1 to n1 do begin
if (n mod z = 0) then e:=e+z;
end;
if (e=n)
then writeln('соверншенное')
else writeln('0');
end.
Var i,s : Integer;
Begin
s:=0;
For i:=1 to a-1 do
If a mod i=0 then s:=s+i;
Check:=s=a;
end;
Var N : Integer;
Begin
Readln(N);
Writeln(Check(N));
end.
function СовершенноеЧисло(n: integer): boolean;
begin
var (s,d,n2) := (1,2,n div 2);
while d <= n2 do
begin
if n mod d = 0 then s += d;
Inc(d)
end;
Result := n = s
end;
begin
if СовершенноеЧисло(ReadInteger) then Print('Совершенное')
else Print('Несовершенное')
end.
Пример33550336Совершенное//Pascal
var
n, s, i: integer;
begin
s := 0;
readln(n);
// Находим делители до n-1, увеличиваем сумму s на i,
// если i - делитель введенного числа
for i := 1 to n - 1 do
if n mod i = 0 then s := s + i;
if s = n then
writeln('cовершенное')
else
writeln('не совершенное');
end.