你好我想在Prolog中找到一个数字列表的GCD,但我无法做到。 你能帮忙吗?
我甚至几乎没有接近,所以到现在为止我不会分享我的任何工作。 PP:在试图解决这个问题的过程中,我遇到了另一个我无法解决的问题,如果你能帮助解决这个问题,我将不胜感激。它找到了两个数字的所有常见除数。
谢谢!
答案 0 :(得分:1)
感谢Lurker! 我没有使用正确的算法。我想找到两个数字的GCD,然后找到GCD的结果和下一个数字,但我不确定为什么我感到困惑,这不会起作用。
无论如何,这是代码:
gcd(0,X,X):- X > 0, !.
gcd(X,Y,Z):- X>=Y, X1 is X -Y, gcd(X1,Y,Z).
gcd(X,Y,Z):- X<Y, X1 is Y-X, gcd(X1,X,Z).
gcdL([H,H1|T],Z):-gcd(H,H1,X),gcdL([X|T],Z).
gcdL([H1,H2],Z):-gcd(H1,H2,Z).
这里好奇的是我试图实现的迟钝方法。我几乎在那里,因为脚本给出的第一个答案是正确的,但它继续回溯。无论如何,它是丑陋,冗长,艰难和低效的:
minel([X],X).
minel([H,H1|T],X):-H>H1,minel([H1|T],X).
minel([H,H1|T],X):-H=<H1,minel([H|T],X).
gcdL(L,X):-gcdL(L,X,1).
gcdL(L,X,C):-minel(L,M),C<M,delAll(L,C),Temp is C,C1 is C + 1,gcdL(L,R,C1),X is max(Temp,R).
gcdL(L,X,C):-minel(L,M),C1 is C + 1,C1=<M,gcdL(L,X,C1).
gcdL(L,X,C):-minel(L,M),C=:=M,X is 1.
delAll([T],X):- 0 is mod(T,X).
delAll([H|T],X):- 0 is mod(H,X),delAll(T,X)
注意事项:首先找到最合适的算法,然后尝试编写问题脚本。
答案 1 :(得分:-1)
我相信这个链接会对你有所帮助 https://math.stackexchange.com/questions/8611/number-of-common-divisors-between-two-given-numbers 坚持计数,你可以将数字存储到一个表格中。例如。