Description

下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式。

      * * *
x * *
-------
* * *
* * *
-------
* * * *

数字只能取代*,当然第一位不能为0,况且给定的数字里不包括0。

注意一下在美国的学校中教的“部分乘积”,第一部分乘积是第二个数的个位和第一个数的积,第二部分乘积是第二个数的十位和第一个数的乘积.

写一个程序找出所有的牛式。

Input

Line 1:数字的个数n。 Line 2:N个用空格分开的数字(每个数字都∈ {1,2,3,4,5,6,7,8,9})。

Output

 共一行,一个数字。表示牛式的总数。
 下面是样例的那个牛式。

        2 2 2
x 2 2
---------
4 4 4
4 4 4
---------
4 8 8 4

Sample Input

5
2 3 4 6 8

Sample Output

1

解题思路:纯粹的暴力枚举一下即可,不过为了提高代码效率,我们可以将查找判断该数的组成数是否给定集合写成一个函数。
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int vis[];
int judge(int x)
{
int k;
while(x)
{
k=x%;
if(!vis[k])
{
return ;
}
x=x/;
}
return ;
}
int main()
{
int n,i,j,x,y,counts,a;
scanf("%d",&n);
memset(vis,,sizeof(vis));
for(i=; i<n; i++)
{
scanf("%d",&a);
vis[a]=;///记录可以出现的数
}
counts=;
for(i=; i<=; i++)///牛式第一行
{
if(judge(i))
{
for(j=; j<=; j++)///牛式第二行
{
if(judge(j))
{
if(i*j>)
{
continue;
}
x=j/;
y=j%;///牛式三四行
if(x*i>||y*i>)
{
continue;
}
if(judge(i*j)&&judge(x*i)&&judge(y*i))///牛式第五行
{
counts++;
}
}
}
}
}
printf("%d\n",counts);
return ;
}
05-11 18:01