题目:给一个整形M,(假设是20),再给出一个N(是把M分成不相等的比M小的数相加的个数),打印出有几种写法例如:
1+2+3+4+10=20;
解:
int main()
{
int M,N;
cin>>M>>N;
int *l=(int *)malloc(N*sizeof(int));
pn(M,N,l,0);
return 1;
}
//p是数组中位置,如果到最后一位的后一位,打印数组
void pn(int M,int N,int *l,int p)
{
if(p==N)
{
int sum=0;
for(int i=0;i<N;i++)
sum+=l[i];
if(sum==M){
for(int i=0;i<N;i++)
cout<<l[i]<<" ";cout<<endl;
}
return;
}
else{
if(p)
{
if(l[p-1]>=M) return;
for(int i=l[p-1]+1;i<=M;i++)
{
int sum=0;
l[p]=i;
for(int j=0;j<=p;j++)
{
sum+=l[j];
}
if(sum>M)
{return;}
else
{pn(M,N,l,p+1);}
}
}
else{
for(int i=1;i<=M;i++)
{
l[p]=i;
pn(M,N,l,p+1);
}
}
}
}