栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

最大乘积 (全排列)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

最大乘积 (全排列)

题目描述

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/605388.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号