Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2008, 21:04   #1
Karabas
Пользователь
 
Регистрация: 22.11.2008
Сообщений: 15
По умолчанию Определить является ли данное число совершенным.. Паскаль.

Определить является ли данное число совершенным.
Код:
program sover (input,output);
 var n,i,k:integer;
 begin
   writeln('Vvedite chislo');
   read(n);i:=2;k:=1;
   while i<=round(sqrt(n)) do
   begin
    if (n)mod(i)=0 then k:=k+i+(n)div(i); 
    i:=i+1 
   end;
   writeln(n=k)
   end.
Но у этой программы есть минус-если число полный квадрат,то один делитель считается два раза.Подскажите как можно исправить программу,чтобы избавиться от этого.
Karabas вне форума Ответить с цитированием
Старый 22.12.2008, 21:40   #2
5naip
Форумчанин
 
Аватар для 5naip
 
Регистрация: 05.10.2007
Сообщений: 536
По умолчанию

честно говоря - в твоем коде не разбирался лень.
написал вот что:
Код:
var
  i,j,sum,x:integer;
begin
write('Vvedite 4islo: ');
readln(x);
sum:=0;
for i:=x-1 downto 1 do
  if x mod i = 0 then sum:=sum+i;
if sum = x
  then write('sovershennoe')
  else write('nesovershennoe');
readln;
end.
если верить википедии - работает.
Цитата:
Совершенное число́ (др.-греч. ἀριθμὸς τέλειος) — натуральное число, равное сумме всех своих собственных делителей (т. е. всех положительных делителей, отличных от самого́ числа).

Первое совершенное число — 6 (1 + 2 + 3 = 6), следующее — 28 (1 + 2 + 4 + 7 + 14 = 28). По мере того как натуральные числа возрастают, совершенные числа встречаются всё реже. Третье совершенное число — 496, четвёртое — 8128, пятое — 33 550 336, шестое — 8 589 869 056 (последовательность A000396 в OEIS).
rocklistener...
5naip вне форума Ответить с цитированием
Старый 22.12.2008, 23:30   #3
Karabas
Пользователь
 
Регистрация: 22.11.2008
Сообщений: 15
По умолчанию

Цитата:
Сообщение от 5naip Посмотреть сообщение
написал вот что:
В твоей программе мы делаем n-1 сравнений,в моей sqrt(n)-1.Для больших чисел разница очевидна.Я не спорю что так мы избавляемся от ошибки,но какой ценой....
Вопрос всё ещё остаётся открытым.
Karabas вне форума Ответить с цитированием
Старый 22.12.2008, 23:56   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Ошибка кроется тут:
Код:
while i<=round(sqrt(n)) do
А именно, в округлении. Надо заменить на Trunc (Sqrt (n)), что бы всегда округлять в меньшую сторону (т.е., отрезать дробную часть).

P.S. На счёт оптимизации. Заметьте, что на каждой итерации цикла будет считаться корень. Лучше сделать так:
Код:
 var n,i,k:integer;
 begin
   writeln('Vvedite chislo');
   readln(n); k:=1;
   for i := 2 to trunc(sqrt(n)) do
    if n mod i = 0 then inc (k, i + n div i);
   writeln(n=k);
end.

Последний раз редактировалось Arigato; 22.12.2008 в 23:59.
Arigato вне форума Ответить с цитированием
Старый 23.12.2008, 14:25   #5
Karabas
Пользователь
 
Регистрация: 22.11.2008
Сообщений: 15
По умолчанию

Если round заменить на trunk то всё равно если n=m^2,то m мы посчитаем два раза.То есть если n=9,то k=7.А k должно быть равно 1+3=4.
В принципе в начале можно делать проверку

program sover (input,output);
var n2,n,i,k:integer;
begin
writeln('Vvedite chislo');
read(n);i:=2;k:=1;n2:=round(sqrt(n) );
while i<=n2 do
begin
if (n)mod(i)=0 then k:=k+i+(n)div(i);
i:=i+1
end;
if n=sqr(n2) then k:=k-n2;
writeln(n=k)
end.
Вот как-то так...
Karabas вне форума Ответить с цитированием
Старый 23.12.2008, 21:15   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Можно заменить эту строку: if n mod i = 0 then inc (k, i + n div i);
на
Код:
 if n mod i = 0 then
begin
  inc (k, i);
  if n div i <> i then inc (k, n div i);
end;
Arigato вне форума Ответить с цитированием
Старый 23.12.2008, 21:53   #7
Karabas
Пользователь
 
Регистрация: 22.11.2008
Сообщений: 15
По умолчанию

Ну можно и так.Спасибо всем.
Karabas вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить, является ли матрица магическим квадратом. drakon803 Помощь студентам 11 14.12.2011 14:29
является ли заданное натуральное число совершенным Савинова Помощь студентам 3 19.11.2008 09:51
определить является ли четырехугольник квадратом Ntfser Общие вопросы Delphi 2 18.10.2008 16:48
Ввести число N и определить делится ли оно без остатка на число M (VBA) Ivanich Microsoft Office Excel 7 24.04.2008 19:43
Паскаль.программа, которая определяет каким является введенное число... Integer Помощь студентам 4 18.11.2007 22:17