提交时间:2024-06-10 10:00:10

运行 ID: 150949

#include <iostream> using namespace std; #define N 10000 int main(){ int n;cin>>n; int a[N]; if(n==1) cout<<1<<endl; else if(n==2) cout<<2<<endl; else if(n==3) cout<<2<<endl; else if(n==4) cout<<3<<endl; else{//n>=5时 int num=2; n=n-num;//首先存入2 (1计入因子中,乘积较小,例如1*2*3<2*4) int i=0; a[i]=num; int OneSum=0;//记录n减去数组中存储的不同自然数总和的结果 while(n>a[i]){//注:while是先判断,再执行 num++;i++;//已经存了2,所以先各+1 a[i]=num; OneSum=n=n-num; } int flag=i; int OutNum=1;//存储因子乘积,输出是乘积结果,初始值为1 while(OneSum>0){//将因子数组从后往前 OneSum个数皆+1 a[i]=a[i]+1; OneSum=OneSum-1; i--; if(i==-1) {i=flag;} //新补加条件, 例如n=8,分解为2、3余3,2+1,3+1,OneSum还余1,所以需要重新从数组末尾再遍历 //例n=13,分解为2,3,4余4,此操作是三个数皆加一后,将i赋值到flag即数组存储的末尾 //即 2+1,3+1,4+2 } for(int i=0;i<=flag;i++){//计算乘积 //cout<<a[i]<<endl;执行此操作方便理解 OutNum=OutNum*a[i]; } cout<<OutNum<<endl; return 0; } }