В твоей программе мы делаем n-1 сравнений,в моей sqrt(n)-1.Для больших чисел разница очевидна.Я не спорю что так мы избавляемся от ошибки,но какой ценой.
Вопрос всё ещё остаётся открытым.
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 16,107
Ошибка кроется тут:
while i
А именно, в округлении. Надо заменить на 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 .
Пользователь
Регистрация: 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 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.
Вот как-то так.
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 16,107
Можно заменить эту строку: 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;
Пользователь
Регистрация: 22.11.2008
Сообщений: 15
Ну можно и так.Спасибо всем.
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Определить, является ли матрица магическим квадратом. | 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 |
ПРОВЕРКА ЧИСЛА НА ЧЁТНОСТЬ В C#| C# ДОМАШНИЕ ЗАДАНИЯ | #2
Источник: www.programmersforum.ru
Составьте программу, проверяющую, является ли число совершенным. Необходимо минимум проходов — C (СИ)
Натуральное число называют совершенным, если оно равно сумме всех своих делителей, не считая его самого. (Например, 6=1+2+3 — совершенное число). Составьте программу, проверяющую, является ли число совершенным.
Формат входных данных:
Натуральное число A
YES, если является совершенным. NO, если не является совершенным.
Код к задаче: «Составьте программу, проверяющую, является ли число совершенным. Необходимо минимум проходов»
Листинг программы
#include #include int main() < int a; int i = 1; int b = 0; printf(«Vvedite chislo: «); scanf(«%d», while(i != a)< if(a % i == 0) b += i; i++; >if(a == b) printf(«Yesn»); else printf(«No»); return 0; >
Источник: studassistent.ru
Совершенное число
Напишите функцию, которая будет проверять, является ли целое число совершенным числом.
Совершенное число — натуральное число, равное сумме всех своих собственных делителей (то есть всех положительных делителей, отличных от самого числа).
Например, 6 — совершенное число, поскольку 1 + 2 + 3 = 6, а 1, 2 и 3 — делители числа 6.
Аналогично, совершенным числом является 28, поскольку 1 + 2 + 4 + 7 + 14 = 28.
Примеры
check_perfect(6) ➞ True check_perfect(28) ➞ True check_perfect(496) ➞ True check_perfect(12) ➞ False check_perfect(97) ➞ False
Варианты решений
def check_perfect(num): return sum([i for i in range(1, num) if num%i==0]) == num
def check_perfect(num): factors = [] for i in range(1,num): if num % i == 0: factors.append(i) return sum(factors) == num
Источник: pythonist.ru