您的位置:首页 > 理论基础 > 计算机网络

http://acm.fzu.edu.cn/problem.php?pid=1698 最大乘积

2012-12-05 14:18 351 查看
Problem Description
一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。
现在你的任务是将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。



Input

只一个正整数n,(3<= n< 10000)。



Output

第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。第二行是最大的乘积
 
10
 
2 3 5
60
很典型的数分解:
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int f[550],a[500];
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n == 3)
printf("1 2\n%d\n",2);
else if(n == 4)
printf("1 3\n%d\n",3);
else{
int sum = 0,v = 1;
memset(f,0,sizeof(f));
for(int i = 2;i < 200;i ++)
{
sum += i;
if(sum > n){sum -= i;break;}
a[v ++] = i;
}
int ss = n - sum;
while(ss --)
{
for(int i = 1;i < v;i ++)
if(i == v - 1)
a[i] ++;
else if(a[i] + 1 < a[i + 1])
{
a[i] ++;
break;
}
}
printf("%d",a[1]);
for(int i = 2;i < v;i ++)
printf(" %d",a[i]);
printf("\n");
f[1] = 1;
int s;
for(int i = 1;i < v;i ++)
{
int c = 0;
for(int j = 1;j < 550;j ++)
{
s = f[j] * a[i] + c;
f[j] = s % 10;
c = s / 10;
}
}
int k;
for(int i = 550;i >= 1;i --)
if(f[i])
{
k = i;
break;
}
for(int i = k ;i >= 1;i --)
printf("%d",f[i]);
printf("\n");
}
}
return 0;
}


 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: