Math 密码算术乘法序言
我掌握了密码运算和加法的概念,但我不知道如何做乘法密码运算。简单地说就是2*6=12或者沿着这些线的某个东西,没有给出乘法问题的中间附加部分。我在网上找不到任何东西,我已经找到了问题的一些限制条件,但没有任何东西能让我找到一些答案。不知道去哪里问这个问题,觉得这是最好的地方 我想知道如何解决一个乘法密码算术问题 我已经得出结论:Math 密码算术乘法序言,math,prolog,cryptarithmetic-puzzle,Math,Prolog,Cryptarithmetic Puzzle,我掌握了密码运算和加法的概念,但我不知道如何做乘法密码运算。简单地说就是2*6=12或者沿着这些线的某个东西,没有给出乘法问题的中间附加部分。我在网上找不到任何东西,我已经找到了问题的一些限制条件,但没有任何东西能让我找到一些答案。不知道去哪里问这个问题,觉得这是最好的地方 我想知道如何解决一个乘法密码算术问题 我已经得出结论: T W O * S I X _________________ T W E L V E T \= 0 which
T W O
* S I X
_________________
T W E L V E
T \= 0 which also means S \= 0
T is 1-6
E is (O*X) mod 10
O or X cannot be 0 or 1 since E has to be different and 0 or 1 gives the same value
as either O or X.
编辑:我使用的是生成和测试方法
solve(T,W,O,S,I,X,E,L,V) :-
X = [T,W,O,S,I,X,E,L,V],
Digits = [0,1,2,3,4,5,6,7,8,9],
assign_digits(X, Digits),
T > 0,
S > 0,
100*T + 10*W + O * 100*S + 10*I + X =:=
100000*T + 10000*W + 1000*E + 100*L + 10*V + E,
write(X).
select(X, [X|R], R).
select(X, [Y|Xs], [Y|Ys]):- select(X, Xs, Ys).
assign_digits([], _List).
assign_digits([D|Ds], List):-
select(D, List, NewList),
assign_digits(Ds, NewList).
与约束逻辑编程无关。例如,在: 第一个解决方案:
[eclipse]: puzzle([T,W,O,S,I,X,E,L,V]).
T = 1
W = 6
O = 5
S = 9
I = 7
X = 2
E = 0
L = 3
V = 8
Yes (0.01s cpu, solution 1, maybe more) ?
number_to_digits(Number,List) :-
length(List,Len),
ntb(0,Len,Number,List).
ntb(N,_,N,[]).
ntb(C,E,N,[D|L]) :-
NE is E-1,
V is C + D*10^NE,
ntb(V,NE,N,L).
crypto(In1, In2, Out) :-
term_variables([In1, In2, Out], Vars),
permutation([0,1,2,3,4,5,6,7,8,9], Perm),
append(_, Vars, Perm),
number_to_digits(N1, In1),
number_to_digits(N2, In2),
number_to_digits(N3, Out),
N3 is N1 * N2.
有3种不同的解决方案:
[eclipse]: puzzle([T,W,O,S,I,X,E,L,V]), writeln([T,W,O,S,I,X,E,L,V]), fail.
[1, 6, 5, 9, 7, 2, 0, 3, 8]
[2, 1, 8, 9, 6, 5, 0, 3, 7]
[3, 4, 5, 9, 8, 6, 0, 1, 7]
No (0.02s cpu)
更新-转换为SWI序言:
:- use_module(library(clpfd)).
puzzle(Vars) :-
[T,W,O,S,I,X,E,L,V] = Vars,
Vars ins 0..9,
all_different(Vars),
T #> 0, S #> 0,
(100*T + 10*W + O) * (100*S + 10*I + X) #=
100000*T + 10000*W + 1000*E + 100*L + 10*V + E,
label(Vars).
更通用且无CLP解决方案:
[eclipse]: puzzle([T,W,O,S,I,X,E,L,V]).
T = 1
W = 6
O = 5
S = 9
I = 7
X = 2
E = 0
L = 3
V = 8
Yes (0.01s cpu, solution 1, maybe more) ?
number_to_digits(Number,List) :-
length(List,Len),
ntb(0,Len,Number,List).
ntb(N,_,N,[]).
ntb(C,E,N,[D|L]) :-
NE is E-1,
V is C + D*10^NE,
ntb(V,NE,N,L).
crypto(In1, In2, Out) :-
term_variables([In1, In2, Out], Vars),
permutation([0,1,2,3,4,5,6,7,8,9], Perm),
append(_, Vars, Perm),
number_to_digits(N1, In1),
number_to_digits(N2, In2),
number_to_digits(N3, Out),
N3 is N1 * N2.
这是相当低效的,而且这个问题应该像@Sergey那样使用CLP来解决,但也许有人会对没有CLP的可能解决方案感兴趣
输入和输出:
?- crypto([T,W,O], [S,I,X], [T,W,E,L,V,E]).
T = 0,
W = 5,
O = 7,
S = 9,
I = 6,
X = 2,
E = 4,
L = 8,
V = 3;
(...)
(57*962=54834)。清楚地说明你的问题是什么。还要检查这是否不是你想要的东西:我把它放在那里,但我只想知道如何至少在纸上解决这个问题。我不知道怎么做,一个加法问题很容易。你发布的那个链接是一个附加问题,我理解这些问题。我对eclipse prolog不太熟悉,我用swi prolog来做。你能解释一下什么是
标签(Vars)。
,所有不同的(Vars)。
和库(ic)
?@user2318083我在SWI Prolog中添加了翻译。见我的答案更新。有关更多信息,请参阅clpfd文档。感谢您的帮助。我用一个不同的方法来处理它,我用我的代码编辑了它,但它总是返回false。我不知道为什么,如果你能看一下我的代码有没有可能?@user2318083你的代码有两个问题很容易解决。第一个问题,在X=[T,W,O,S,I,X,E,L,V]中,
您为所有变量列表选择了nameX
,但您已经有了一个名为X
的变量!第二个问题是100*T+10*W+O*100*S+10*I+X
中缺少括号。在修复这些错误后,您的代码工作正常。