题目描述
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<iostream>
#include<unordered_set>
#include<algorithm>
using namespace std;
int main() {
int ans = 0;
int a[] = { 1,2,3,4,5,6,7,8,9 };
unordered_set<int>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;
}