USACO 1.3.4 Prime Cryptarithm 牛式(模拟枚举)

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 }
原文地址:https://www.cnblogs.com/wkfvawl/p/9705691.html