Вычисление суммы четных делителей натурального числа на Turbo Prolog

Узнай цену своей работы

Формулировка задачи:

Добрый день. Есть задача: Составьте программу вычисления суммы четных делителей натурального числа М. Написал такой код:
Листинг программы
  1. predicates
  2. is_prime(integer,integer,integer).
  3. sum(integer,integer,integer).
  4. res(integer,integer).
  5. clauses
  6. is_prime(_,1,1):-!.
  7. 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).
  8. sum(+,1,0):-!.
  9. 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;
  10. N mod D=0,D mod 2=0,is_prime(N,N,K),K=2,D1=D-1,sum(N,D1,S);
  11. N mod D=0,D mod 2=0,is_prime(N,N,K),K<2,D1=D-1,sum(N,D1,S);
  12. N mod D>0,D mod 2>0,D1=D-1,sum(N,D1,S).
  13. res(N,S):-sum(N,N,S).
Подскажите, пожалуйста, где здесь ошибка? Если ввожу 4 или 8, то количество делителей считает Если ввожу 6,10 или 12 - выдает что нет решений Спасибо.

Решение задачи: «Вычисление суммы четных делителей натурального числа на Turbo Prolog»

textual
Листинг программы
  1. domains
  2. int=integer
  3.  
  4. predicates
  5. sum_even_div(int,int,int)
  6. task(int,int)
  7.  
  8. clauses
  9. sum_even_div(N,_,0) :- (N mod 2) <> 0, !.
  10. sum_even_div(N,K,0) :- K > (N div 2), !.
  11. sum_even_div(N,K,R) :- (N mod K)=0, K1=K+2, sum_even_div(N,K1,R1), R=R1+K.
  12. sum_even_div(N,K,R) :- (N mod K)<>0, K1=K+2, sum_even_div(N,K1,R).
  13.  
  14. task(N,R) :- sum_even_div(N,2,R).

Объяснение кода листинга программы

  1. В коде используется язык программирования Prolog.
  2. Код решает задачу вычисления суммы четных делителей натурального числа N.
  3. Для решения задачи используется рекурсивный алгоритм.
  4. В первой линии правил sum_evendiv(N,,0) :- (N mod 2) <> 0, !. проверяется, является ли N нечетным числом. Если это так, то рекурсия прекращается и значение R остается равным 0.
  5. Во второй линии правил sum_even_div(N,K,0) :- K > (N div 2), !. проверяется, является ли K больше половины значения N. Если это так, то рекурсия прекращается и значение R остается равным 0.
  6. В третьей и четвертой линиях правил 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.
  7. В последней строке task(N,R) :- sum_even_div(N,2,R). задается начальное значение N и R для функции sum_even_div, которая начинает вычислять сумму четных делителей N.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы