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
解题思路:纯粹的暴力枚举一下即可,不过为了提高代码效率,我们可以将查找判断该数的组成数是否给定集合写成一个函数。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int vis[10]; 7 int judge(int x) 8 { 9 int k; 10 while(x) 11 { 12 k=x%10; 13 if(!vis[k]) 14 { 15 return 0; 16 } 17 x=x/10; 18 } 19 return 1; 20 } 21 int main() 22 { 23 int n,i,j,x,y,counts,a; 24 scanf("%d",&n); 25 memset(vis,0,sizeof(vis)); 26 for(i=0; i<n; i++) 27 { 28 scanf("%d",&a); 29 vis[a]=1;///记录可以出现的数 30 } 31 counts=0; 32 for(i=100; i<=999; i++)///牛式第一行 33 { 34 if(judge(i)) 35 { 36 for(j=10; j<=99; j++)///牛式第二行 37 { 38 if(judge(j)) 39 { 40 if(i*j>9999) 41 { 42 continue; 43 } 44 x=j/10; 45 y=j%10;///牛式三四行 46 if(x*i>999||y*i>999) 47 { 48 continue; 49 } 50 if(judge(i*j)&&judge(x*i)&&judge(y*i))///牛式第五行 51 { 52 counts++; 53 } 54 } 55 } 56 } 57 } 58 printf("%d ",counts); 59 return 0; 60 }