Prime Cryptarithm牛式
下面是一个乘法竖式,如果用我们给定的那几个数字来取代*,可以使式子成立的话,我们就叫这
个式子牛式.
* * *
x * *
-------
* * *
* * *
-------
* * * *
数字只能取代*,当然第一位不能为 0.
写一个程序找出所有的牛式.
PROGRAM NAME: crypt1
INPUT FORMAT
Line 1: 数字的个数.
Line 2: N 个用空格分开的数字(每个数字都∈{1,2,3,4,5,6,7,8,9}) .
SAMPLE INPUT (file crypt1.in)
5
2 3 4 6 8
OUTPUT FORMAT
共一行,一个数字.表示牛式的总数.下面是样例的那个牛式.
2 2 2
x 2 2
------
4 4 4
4 4 4
---------
4 8 8 4
SAMPLE OUTPUT (file crypt1.out)
1
==================================
由于告诉了式子的形式,所以就不用一位一位的去枚举的...
可以枚举111——999
11——99
------------------
111——999
111——999
-------------------
1111——9999
==================================
{
ID:jie19952
PROG:crypt1
LANG:PASCAL
}
var
n:longint;
a:array[1..9]of longint;
f:array['0'..'9']of boolean;
procedure init;
begin
assign(input,'crypt1.in');
assign(output,'crypt1.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
function check(t:longint):boolean;
var
st:string;
i:longint;
begin
check:=true;
str(t,st);
for i:=1 to length(st) do
if not f[st[i]] then exit(false);
end;
procedure main;
var
i,j:longint;
tem:longint;
ans:longint;
begin
readln(n);
fillchar(f,sizeof(f),false);
for i:=1 to n do
begin
read(a[i]);
f[char(a[i]+ord('0'))]:=true;
end;
ans:=0;
for i:=111 to 999 do
if check(i) then
for j:=11 to 99 do
if (i*j<=9999)and check(j) then
begin
if ((i*(j mod 10))<=999)and (i*(j div 10)<=999) then
if check(i*j) and check(i*(j mod 10)) and check(i*(j div 10)) then
inc(ans);
end;
writeln(ans);
end;
begin
init;
main;
terminate;
end.