乘积最大值

文章讨论了如何利用C语言的暴力搜索和优化方法,寻找给定五个不同数字组成三位数和两位数乘积时的最大可能值,强调了数字排列策略和算法效率。
摘要由CSDN通过智能技术生成

给出五个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;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值