Напишите программу, которая вводит натуральное число N и определяет является ли число N...

0 голосов
73 просмотров

Напишите программу, которая вводит натуральное число N и определяет является ли число N совершенным. Если можно с подробным или кратким объяснением


Информатика (45 баллов) | 73 просмотров
Дано ответов: 2
0 голосов
Правильный ответ

Число считается совершенным, если оно равно сумме своих делителей, исключая себя самого. Для проверки, является ли число 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
Число не является совершенным



(142k баллов)
0 голосов

По определению совершенным числом называется то число, которое равно сумме своих делителей отличных от самого числа. Значит,чтобы решить задачу нам нужно найти сумму делителей числа и проверить равна ли она самому числу.
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.

(2.4k баллов)
0

Нет смысла делить на числа, большие половины делимого.