2018年第九届蓝桥杯Java程序设计本科B组决赛个人题解汇总:
https://blog.youkuaiyun.com/daixinliangwyx/article/details/90258768
第二题
标题:最大乘积
把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。
比如:
984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
...
符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?
注意,需要提交的是一个整数,表示那个最大的积,不要填写任何多余的内容。
(只提交乘积,不要提交整个算式)
解法:直接用全排列函数跑,遍历乘号位置,算出两组数相乘的结果,然后另开一个数组记录1到9出现的总次数来判断符不符合条件。
代码:
#include<bits/stdc++.h>
using namespace std;
long long num[9], f[10], maxn, num1, num2, s;
int main() {
for (long long i = 1; i < 10; i++)
num[i-1] = i;
maxn = 0;
do {
for (long long i = 1; i < 9; i++) {
num1 = 0;
for (long long j = 0; j < i; j++)
num1 = num1 * 10 + num[j];
num2 = 0;
for (long long j = i; j < 9; j++)
num2 = num2 * 10 + num[j];
s = num1 * num2;
if (s < 123456789 || s > 987654321) continue;
memset(f, 0, sizeof(f));
while (s) {
f[s%10]++;
s /= 10;
}
int sum = 0;
for (int i = 1; i <= 9; i++)
if (f[i]) sum++;
if (sum == 9) maxn = max(maxn, num1*num2);
}
} while (next_permutation(num, num+9));
cout << maxn << endl;
return 0;
}