【发布时间】:2024-07-03 23:50:02
【问题描述】:
我尝试在 SWI-Prolog 中应用 Luhn 算法。但是我在运行时遇到了一些问题。当我用像 123 这样的简单数字进行测试时,它会很快给出结果。如果我使用更长的数字(如 5379173895860200)进行测试,它会运行很长时间,以至于我只能中止此执行。需要帮助才能发现问题。 代码:
luhn(N):-
spliter(N,Y),
reverse(Y, Z),
check(Z,X),
sum_all(X, Res),
T is Res mod 10,
T is 0.
spliter(0,[]).
spliter(N,L):-
N1 is floor(N/10),
X is N mod 10,
spliter(N1, L2),
L = [X|L2].
check(A,B):-
double(A,B,_).
double([],[],0).
double([H|T], [H1|T1], C):-
double(T,T1, C1),
C is C1 +1,
H1 is H*(1+ C mod 2).
sum_all([],0).
sum_all([H|T],Sum):-
sum_all(T,Subsum),
X is floor(H/10),
Y is H mod 10,
Sum is (Subsum + X + Y).
【问题讨论】:
-
0 =:= Res mod 10更简洁。 -
N1 is N div 10更精确(对于非常大的数字)。
标签: algorithm prolog failure-slice luhn