题目描述
一个正整数一般可以分为几个互不相同的自然数的和,如 3=1+23=1+2,4=1+34=1+3,5=1+4=2+35=1+4=2+3,6=1+5=2+46=1+5=2+4。
现在你的任务是将指定的正整数 nn 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
输入格式
只一个正整数 nn,(3≤n≤10000)。
输出格式
第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。
第二行是最大的乘积。
输入输出样例
输入
10
输出
2 3 5 30
思路:
首先,确定一个有序数组,将数组中的元素相加再减去输入,把数组中对应的元素删掉。
通过高精乘得出答案。
代码
#include<stdio.h>
int main(){
int b[100000]={0};
b[0]=1;
int target;
int sum=0;
int count=0;
int a[200]={0};
int n;
scanf("%d",&n);
for(int i=2;;i++){
sum+=i;
a[count]=i;
count++;
if(sum>n)
break;
}
int temp=sum-n;
if(temp==1){
a[0]=1;
a[count-1]=a[count-1]+1;
}else{
a[temp-2]=1;
}
for(int i=0;a[i]!=0;i++){
for(int j=0;j<500;j++){
target=a[i];
b[j]=b[j]*target;
}
for(int i=0;i<500;i++){
if(b[i]>9){
b[i+1]=b[i+1]+b[i]/10;
b[i]=b[i]%10;
}
}
}
for(int i=0;a[i]!=0;i++){
if(a[i]==1)
continue;
printf("%d ",a[i]);
}
printf("\n");
int m;
for(m=99999;m>0&&b[m]==0;m--) ;
for(int i=m;i>=0;i--){
printf("%d",b[i]);
}
return 0;
}