下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式。
* * *
x * *
-------
* * *
* * *
-------
* * * *
数字只能取代*,当然第一位不能为0。
注意一下在美国的学校中教的“部分乘积”,第一部分乘积是第二个数的个位和第一个数的积,第二部分乘积是第二个数的十位和第一个数的乘积.
写一个程序找出所有的牛式。
INPUT FORMAT:
(file crypt1.in)
Line 1:数字的个数n。
Line 2:N个用空格分开的数字(每个数字都∈{1,2,3,4,5,6,7,8,9})。
OUTPUT FORMAT:
(file crypt1.out)
共一行,一个数字。表示牛式的总数。
下面是样例的那个牛式。
2 2 2
x 2 2
------
4 4 4
4 4 4
---------
4 8 8 4
input:
5
2 3 4 6 8
output:
1
【参考程序】:
/*
ID: XIONGNA1
PROG: crypt1
LANG: C++
*/
#include<iostream>
#include<cstring>
using namespace std;
int n,ans;
int a[10];
bool bo[11];
bool check(int s)
{
int t;
while (s)
{
t=s%10;
if (!bo[t]) return false;
s=s/10;
}
return true;
}
int main()
{
freopen("crypt1.in","r",stdin);
freopen("crypt1.out","w",stdout);
scanf("%d",&n);
memset(bo,false,sizeof(bo));
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);bo[a[i]]=true;
}
n=0;
for (int i=1;i<=9;i++)
if (bo[i])
{
n++;a[n]=i;
}
ans=0;int res1,res2,res3,xx;
bool bk;
for (int x1=1;x1<=n;x1++)
for (int x2=1;x2<=n;x2++)
for (int x3=1;x3<=n;x3++)
{
for (int x4=1;x4<=n;x4++)
{
for (int x5=1;x5<=n;x5++)
{
bk=true;
xx=a[x1]*100+a[x2]*10+a[x3];
res3=xx*(a[x4]*10+a[x5]);
if (res3>9999)
{
bk=false;break;
}
if (!check(res3)) continue;
res2=xx*a[x4];
if (res2>999) continue;
if (!check(res2)) continue;
res1=xx*a[x5];
if (res1>999) continue;
if (!check(res1)) continue;
ans++;
}
if (!bk) break;
}
if (!bk) continue;
}
printf("%d\n",ans);
return 0;
}