牛式个数

 

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

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

数字只能取代*,当然第一位不能为0。 写一个程序找出所有的牛式。

输入

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

输出

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

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

样例输入

5
2 3 4 6 8
样例输出
1

思路:

1、枚举。一维数组存储三位数、二维数组存储二位数

2、暴力验证。

遇到的问题:

1、答案错误。由于三位数情况未考虑周全,ABB和AAB情况为考虑进去。最后索性三重(0-n)循环

2、运行错误。一维数组空间开辟小了,导致越界存储和访问。

 

 1 #include <iostream>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 int n_nums = 0;
 7 int n_up = 0, n_down = 0;
 8 
 9 void Init(int nums[],int nUp[],int nDown[][2]);
10 bool InNums(int tp,int nums[]);
11 bool IsOk(int tp,int nums[]);
12 void Solve();
13 
14 int main()
15 {
16     Solve();
17     return 0;
18 }
19 void Solve()
20 {
21     //9225
22     int nUp[9226],nums[10];
23     int nDown[82][2];
24     Init(nums,nUp,nDown);
25     int ans = 0;
26     int i, j;
27     int tp1, tp2, tp3;
28     bool b1, b2;
29     for (i = 0; i < n_up; i++)
30     {
31         for (j = 0; j < n_down; j++)
32         {
33             tp1 = nDown[j][0] * nUp[i];
34             tp2 = nDown[j][1] * nUp[i];
35             tp3 = nUp[i] * (nDown[j][0] * 10 + nDown[j][1]);
36             b1 = (tp1 <= 999 && tp1 >= 100 && tp2 <= 999 && tp2 >= 100) ? 1 : 0;
37             b2 = (tp3 <= 9999 && tp3 >= 1000) ? 1 : 0;
38             if (b1&&b2)
39             {
40                 if (IsOk(tp1,nums) && IsOk(tp2,nums) && IsOk(tp3,nums)) {
41                     ans++;
42                 }
43             }
44         }
45     }
46     cout << ans << endl;
47 }
48 void Init(int nums[],int nUp[],int nDown[][2])
49 {
50     int n, i, j, k, get;
51     cin >> n;
52     for (i = 0; i < n; i++)
53     {
54         cin >> get;
55         if (!InNums(get,nums))
56         {
57             nums[n_nums++] = get;
58         }
59     }
60     sort(nums, nums + n_nums);
61     for(i=0; i<n_nums;i++)
62         for(j=0; j<n_nums; j++)
63             for(k=0; k<n_nums; k++)
64                 nUp[n_up++]=nums[i]*100+nums[j]*10+nums[k];
65     for(i=0; i<n_nums; i++)
66         for(j=0; j<n_nums; j++)
67         nDown[n_down][0]=nums[i],nDown[n_down++][1]=nums[j];
68 }
69 bool InNums(int tp,int nums[])
70 {
71     for (int i = 0; i < n_nums; i++)
72         if (tp == nums[i])
73             return true;
74     return false;
75 }
76 bool IsOk(int tp,int nums[])
77 {
78     int b = tp % 10;
79     while (tp)
80     {
81         if (!InNums(b,nums)) {
82             return false;
83         }
84         tp /= 10;
85         b = tp % 10;
86     }
87     return true;
88 }
View Code

 

猜你喜欢

转载自www.cnblogs.com/guoyujiang/p/11831755.html