【蓝桥杯】 2018决赛 最大乘积 (全排列暴力)

题目:

题目描述
把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。
比如:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925

符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?
输出
输出一个整数表示答案


代码:

注意:乘积也必须是1-9各出现一次。

暴力全排列,等个几秒就出答案了

#include <iostream>
#include <algorithm>
#include <string>
#include <set>
using namespace std;
typedef long long ll;
ll ans=0;
string s="123456789"; 
int main() 
{
	do{
		for(int i=1;i<9;i++) //前一个数占的位数最少1位,最多8位
		{
			string a,b;
			for(int j=0;j<i;j++) a+=s[j]; //前一个数
			for(int k=i;k<9;k++) b+=s[k]; //后一个数
			ll aa = stoi(a); //string转int (c++11)
			ll bb = stoi(b);
			ll mul = aa*bb; //乘积
			ll temp = mul;
			set<int> s; 
			while(temp) //把各位数放入set
			{
				if(temp%10==0) break; //出现0就是错误,退出
				s.insert(temp%10);
				temp/=10;
			}
			if(s.size()==9) ans=max(ans,mul); //有九个不同的数,就是1-9,更新ans
		}	
	}while(next_permutation(s.begin(),s.end())); //全排列
	
	//cout<<ans;
	//cout<<843973902; 错误答案!!! 没看清题目,题目要求答案也只包含1-9各一次 
	cout<<839542176;
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值