给出五个0-9之间的数字,每个数字只用一次,填入下图的方框,请问怎样填才能使算式得到最大值。
三位数✖两位数=
输入
输入仅一行,包括五个空格分开的数字。这五个数字从左到右是非递减的。
输出
输出一个整数,即算式能得到的最大值。
样例输入 Copy
6 6 6 6 6
样例输出 Copy
43956
如果各个数字不相等,如1,2,3,4,5,则采用如下形式乘积最大:
431*52=22412
如1,2,3,8,8.则采用:
821*83=68143
有以下明确结论:
(1)最小的数字在三位数的个数:
(2)最大的数字在二位数的首位,次大的数字在三位数的百位;
其他两位数字?假定A最大,B次大,E最小:
BCE*AD-BDE*AC=(C-D)(100A-100B-10E)>=0;
如果A==B,则须使C<=D;
如果A>B,则须使C>=D;
C语言(暴力)
#include<stdio.h>
#include<math.h>
int main()
{
int a[5], max = 0,m,i,j,k,n;
for (i = 0; i < 5; i++)
scanf("%d", &a[i]);
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (j == i)continue;
for (k = 0; k < 5; k++)
{
if (k == i || k == j)continue;
for (m = 0; m < 5; m++)
{
if (m == i || m == j || m == k)continue;
for (n = 0; n < 5; n++)
{
if (n == i || n == j || n == k || n == m)continue;
int t = (a[i] * 100 + a[j] * 10 + a[k]) * (a[m] * 10 + a[n]);
max = fmax(max, t);
}
}
}
}
}
printf("%d", max);
return 0;
}
C语言解法二:
#include<stdio.h>
int main()
{
int A, B, C, D, E;
int res = -1;
scanf("%d%d%d%d%d", &E, &D, &C, &B, &A);
if (A == B)
res = (100 * B + 10 * D + E) * (10 * A + C);
else
res= (100 * B + 10 * C + E) * (10 * A + D);
printf("%d\n", res);
return 0;
}
c++解法:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[5];
int res = -1;
scanf("%d%d%d%d%d", a, a + 1, a + 2, a + 3, a + 4);
do
{
int x = a[0] * 100 + a[1] * 10 + a[2];
int y = a[3] * 10 + a[4];
int r = x * y;
if (r > res)
res = r;
} while (next_permutation(a, a + 5));
cout << res << end1;
return 0;
}