求大佬指点!!!
/*本题思路:
分两步进行:1.分解方案;2.输出乘积
通过推算,我们知道:
分解所得的数越多,乘得的乘积越大;
而乘积最大就是连续的一串数,如果分解一串数后仍有余数,那就把这个数加到倒数第k个数上去,例:
9=2+3+4
10=2+3+4(+1)-->2+3+5
11=2+3+4(+2)-->2+4+5
12=2+3+4(+3)-->5+3+4
13=2+3+4(+4)-->3+4+6
14=2+3+4+5
所以,k有两种情况:
k<=位数,k+=倒数第k个数;
k>位数,k+=2
再输出乘积,因为乘积很大,要进行高精度运算,最后输出*/
#include<bits/stdc++.h>
using namespace std;
int n,k,flag,c[1000001],s;
bool u[10001];//表示该数位是否被占用
int gj(int x){
int len = 1;
for(int i = 1;i <= len;i++){//高精度乘单精度
c[i]*=x;
}
for(int i = 1;i <= len;i++){
c[i+1]+=c[i]/10;
c[i]%=10;
}
while(c[len+1]>9){
len++;
c[len+1]+=c[len]/10;
c[len]%=10;
}
if(c[len+1]!=0) len++;
return len;
}
int main(){
cin>>n;
k=n;
for(int i = 2;i <= n;i++){//循环找相邻的数
k-=i;
u[i]=1;
if(k<0){
flag=i;//记录退出点
k+=i;//恢复
u[i]=0;//恢复
break;
}
}
//分走剩下的k
if(k>flag-2){//k>位数时
u[2]=0;
u[k+2]=1;
flag=2+k;
}
else{//k<=位数时
u[flag]=1;
u[flag-k]=0;
}
c[0]=c[1]=1;
for(int i = 2;i <= flag;i++){
if(u[i]){
cout<<i<<" ";
s=gj(i);
}
}
cout<<endl;
for(int i = s;i >= 1;i--){
cout<<c[i];
}
return 0;
}
/*总结:
做题时长:60min
大改次数:0
小改次数:4
提交次数:1
提交分数:0
做题时间:2023.12.16*/