下面是一个乘法竖式,如果用我们给定的那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 }