第二题:寒假作业
现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:
每个方块代表1~13中的某一个数字,但不能重复。
比如:
6 + 7 = 13
9 - 8 = 1
3 * 4 = 12
10 / 2 = 5
以及:
7 + 6 = 13
9 - 8 = 1
3 * 4 = 12
10 / 2 = 5
就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路:由题可知,题中的序列是固定的,只有1-13这13个元素,所以可以枚举这13个元素的全部全排列,对每个排列根据条件进行筛选。但是13个数字的全排列运算时间非常长,等一个小时左右可以出结果。。。
易错点:除法应该转换为乘法,因为int数作除法会丢掉结果的小数部分,导致错误结果。
1 #include <iostream> 2 #include <string> 3 #include <set> 4 #include <vector> 5 #include <algorithm> 6 7 using namespace std; 8 9 int main() 10 { 11 vector<int> v; 12 for (int i = 1; i <= 13; ++i) 13 v.push_back(i); 14 15 int cnt = 0; 16 do 17 { 18 if (v[0] + v[1] == v[2] && v[3] - v[4] == v[5] && v[6] * v[7] == v[8] && v[9] == v[10] * v[11]) //此处要转换为乘法,因为int数作除法会去除小数部分,导致错误结果 19 cnt++; 20 } while (next_permutation(v.begin(), v.end())); 21 22 cout << cnt << endl; 23 24 return 0; 25 }
思路二:dfs,请参考:https://www.cnblogs.com/FengZeng666/p/10461885.html
最终答案: 64