Вычисление суммы четных делителей натурального числа на Turbo Prolog
Формулировка задачи:
Добрый день. Есть задача: Составьте программу вычисления суммы четных делителей натурального числа М.
Написал такой код:
Подскажите, пожалуйста, где здесь ошибка?
Если ввожу 4 или 8, то количество делителей считает
Если ввожу 6,10 или 12 - выдает что нет решений
Спасибо.
Листинг программы
- predicates
- is_prime(integer,integer,integer).
- sum(integer,integer,integer).
- res(integer,integer).
- clauses
- is_prime(_,1,1):-!.
- is_prime(X,Y,Z):-X mod Y = 0,Y1 = Y-1,is_prime(X,Y1,Z1),Z=Z1+1;X mod Y>0,Y1=Y-1,is_prime(X,Y1,Z).
- sum(+,1,0):-!.
- sum(N,D,S):-N mod D=0,D mod 2=0,is_prime(N,N,K),K>2,D1=D-1,sum(N,D1,S1),S=S1+D;
- N mod D=0,D mod 2=0,is_prime(N,N,K),K=2,D1=D-1,sum(N,D1,S);
- N mod D=0,D mod 2=0,is_prime(N,N,K),K<2,D1=D-1,sum(N,D1,S);
- N mod D>0,D mod 2>0,D1=D-1,sum(N,D1,S).
- res(N,S):-sum(N,N,S).
Решение задачи: «Вычисление суммы четных делителей натурального числа на Turbo Prolog»
textual
Листинг программы
- domains
- int=integer
- predicates
- sum_even_div(int,int,int)
- task(int,int)
- clauses
- sum_even_div(N,_,0) :- (N mod 2) <> 0, !.
- sum_even_div(N,K,0) :- K > (N div 2), !.
- sum_even_div(N,K,R) :- (N mod K)=0, K1=K+2, sum_even_div(N,K1,R1), R=R1+K.
- sum_even_div(N,K,R) :- (N mod K)<>0, K1=K+2, sum_even_div(N,K1,R).
- task(N,R) :- sum_even_div(N,2,R).
Объяснение кода листинга программы
- В коде используется язык программирования Prolog.
- Код решает задачу вычисления суммы четных делителей натурального числа N.
- Для решения задачи используется рекурсивный алгоритм.
- В первой линии правил sum_evendiv(N,,0) :- (N mod 2) <> 0, !. проверяется, является ли N нечетным числом. Если это так, то рекурсия прекращается и значение R остается равным 0.
- Во второй линии правил sum_even_div(N,K,0) :- K > (N div 2), !. проверяется, является ли K больше половины значения N. Если это так, то рекурсия прекращается и значение R остается равным 0.
- В третьей и четвертой линиях правил sum_even_div(N,K,R) :- (N mod K)=0, K1=K+2, sum_even_div(N,K1,R1), R=R1+K. и sum_even_div(N,K,R) :- (N mod K)<>0, K1=K+2, sum_even_div(N,K1,R1), R=R1+K. проверяется, делится ли N на K без остатка. Если это так, то рекурсия продолжается, увеличивая K на 2, и значение R1 становится равным сумме четных делителей N. Значение R при этом увеличивается на K.
- В последней строке task(N,R) :- sum_even_div(N,2,R). задается начальное значение N и R для функции sum_even_div, которая начинает вычислять сумму четных делителей N.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д