最大乘积 (全排列)

题目描述

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值