题目描述
Description
把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。
比如:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
...
符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?
注意,需要提交的是一个整数,表示那个最大的积,不要填写任何多余的内容。
(只提交乘积,不要提交整个算式)
___839542176_____
思路:
<1>:C++中有一个函数可以求出数组当前排列的下一个排列,名为next_permutation。我们在while循环的条件里存放它,初始化数组为1~9这9个数组成数的最小排列方式。
<2>:将题意分为三部分 984672 * 351 = 345619872可以理解为A*B=C,其中A与B组成一组全排列,C组成一组全排列。第一次用while循环将C的全排列存到unordered_set里面(用它是因为它的查找时间为o(1)。然后第二次while循环得到前一组数的全排列将该排列组合分八次进行拆分得到A和B。如果A与B的成绩在unordered_set可以找到且该排列数大于暂存的ans,更新ans的值。
<3>:循环结束后,输出ans。
AC代码:
#include#include #include using namespace std; int main() { int ans = 0; int a[] = { 1,2,3,4,5,6,7,8,9 }; unordered_set us; do { int sum = 0; for (int i = 0; i < 9; i++) { sum += a[i] * pow(10, 8 - i); } us.insert(sum); } while (next_permutation(a, a + 9)); do { int sum = 0, tmp = 0, k; for (int i = 0; i < 9; i++) { sum += a[i] * pow(10, 8 - i); } for (int i = 1; i <= 8; i++) { tmp = tmp * 10 + sum % 10; sum /= 10; k = tmp * sum; if (us.find(k) != us.end() && ans < k) { ans = k; } } } while (next_permutation(a, a + 9)); cout << ans << endl; return 0; }



