下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式。
*** x ** ---------- *** *** ---------- ****(请复制到记事本)
数字只能取代*,当然第一位不能为0,况且给定的数字里不包括0。
注意一下在美国的学校中教的“部分乘积”,第一部分乘积是第二个数的个位和第一个数的积,第二部分乘积是第二个数的十位和第一个数的乘积.
写一个程序找出所有的牛式。
分析:暴力搜索5个数字组成两个因数,把它们的部分乘积转换为字符串后判断位数和数字是否在输入的集合里。
代码
var f,a,b:array[1..9] of longint; i,n,ans:longint; function check:boolean; var i,j:longint; s1,s2,s3:string; begin check:=true; str((b[1]*100+b[2]*10+b[3])*b[5],s1); str((b[1]*100+b[2]*10+b[3])*b[4],s2); str((b[1]*100+b[2]*10+b[3])*(b[4]*10+b[5]),s3); if (length(s1)<>3) or (length(s2)<>3) or (length(s3)<>4) then exit(false); for i:=1 to 3 do if (f[ord(s1[i])-48]<>1) or (f[ord(s2[i])-48]<>1) or (f[ord(s3[i])-48]<>1) then exit(false); if f[ord(s3[4])-48]<>1 then exit(false); end; procedure dfs(dep:longint); var i:longint; begin if dep>5 then begin if check then inc(ans); exit; end; for i:=1 to n do begin b[dep]:=a[i]; dfs(dep+1); end; end; begin readln(n); for i:= 1 to n do begin read(a[i]); f[a[i]]:=1; end; dfs(1); writeln(ans); end.
