设n是一个正整数,要求将n分解为若干互不相同的自然数之和,且这些自然数的乘积最大。
输入:正整数n
输出:计算的最大乘积。
如输入10,则输出30.
提示:若a+b=const ,则a-b的绝对值越小,ab值越大。贪心策略:将n分成从2开始的连续自然数之和,如果最后剩下一个数,则将此数在后项优先的方式下均匀地分给前面各项。
#include<iostream>
#include<cstdio>
using namespace std;
int a[1000];
int n;
int main()
{
int count=1;
while (scanf_s("%d", &n) == 1)
{
int sum = 0, l = 0, left;
for (int i = 2;i <= n;i++)
{
a[l++] = i;
sum += i;
if (sum > n)
{
sum -= i, l--, left = n - sum;
break;
}
}
for (int i = l - 1;left;left--)
{
a[i]++;
i--;
if (i < 0) i = l - 1;
}
for (int i = 0;i < l - 1;i++) {
count = a[i] * count;
}
count = count * a[l - 1];
printf("%d ", count);
}
return 0;
}