根据数据 可以得出一个三位数乘一个两位数,那么111 <= i <= 999 , 11 <= j <= 99,且相乘分布和与乘积均为可找到数,枚举判断即可。
#include <stdio.h>
int count;
int hash[10];
void
init()
{
int z,i,n;
freopen("crypt1.in","r",stdin);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&z);
hash[z] = 1;
}
}
int
pd(int a)
{
while(a > 0)
{
if(!hash[a % 10])return 0;
a/=10;
}
return 1;
}
void
Enum()
{
long a,b,s,i,j;
for(i = 111 ;i <= 999;i++)
for(j = 11 ;j <= 99;j++)
{
s = i * j;
if(s <= 9999)
{
a = i * (j % 10);
b = i * (j / 10);
if(pd(i) && pd(j) && pd(s) && pd(a) && pd(b) && a<1000 && b<1000)count++;
}
}
}
void
write()
{
freopen("crypt1.out","w",stdout);
printf("%ld\n",count);
}
int
main()
{
init();
Enum();
write();
return 0;
}
PS:
1,应注意 对于每个分步和也要在可招数内。
2,分布和为三位数
3,因为C的全局变量特点,初始为0,则可以避免相乘里有0的可能。