题目描述 牛牛上小学二年级了,现在他开始学习乘法。经过老师的悉心教导,牛牛已经能够算出a, b两个数字的乘积了。结果老师发现,牛牛是偷偷拿到了老师的练习题答案,背下答案之后才说对了乘积! 老师非常愤怒,决定给牛牛出更多的乘法题目,现在老师打算对 a, b,这两个数字的数位进行交换,这样就可以构造出新的数字来考牛牛乘法了。 例如原来的两个数字 a,b是 1234和5678,那么他可以交换两个数字的千位,使得两个数字变5234和1678,然后再计算它们的乘积。 老师只会交换相同位置的数位,例如交换两个数字的千位,或者交换两个数字的百位,但是不能交换一个数字的千位和另一个数字的百位(例如交换出 6234和5178是不被允许的)。 老师可以进行无限次交换操作最终得到新的数字a1和b1,请问新的两个数字的乘积最大是多少。

要想使两个数字乘积最大,就要让两个数字尽量接近。不看数字相同的部分,将不同的部分适当交换,让这两个数接近。本题也可使用暴力枚举,每一个位置都交换一次,算出乘积后找到最大的乘积。(注意交换完之后记得还原,不然下一组的乘积会和原来的不一样)

代码:

#include<bits/stdc++.h>
using namespace std;
int num1=0,num2=0;
bool cmp(string a,string b){
	return a>b;
}
int all(string a,string b){
	int idx=0;
	int len=a.size();
	for(int i=0;i<len;i++){
		if(a[i]!=b[i]){
			idx=i;
			break;
		}
	}
	return idx+1;
}
int main()
{
	freopen("mul.in","r",stdin);
    freopen("mul.out","w",stdout);
	string a,b;
	cin>>a>>b;
	if(!cmp(a,b)) swap(a,b); 
	int idx=all(a,b);
	int len=a.size();
	for(int i=idx;i<len;i++){
		if(a[i]>b[i]) swap(a[i],b[i]);
	}
	for(int i=0;i<len;i++){
	num1=num1*10+a[i]-'0';
	num2=num2*10+b[i]-'0';
	}
	cout<<(long long)num1*num2;
	return 0;
}

0 条评论

目前还没有评论...