C语言每日一题-PTA基础编程题-7-37 整数分解为若干项之和-递归

7-37 整数分解为若干项之和 (20分)将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,…。编程求出正整数N的所有整数分解式子。输入格式:每个输入包含一个测试用例,即正整数N (0<< 输出样例:7=1+1+1+1+1+1+1;7=1+1+1+1+1+2;7=1+1+1+1+3;7=1+1+1+2+2
7=1+1+1+4;7=1+1+2+3;7=1+1+5;7=1+2+2+2
7=1+2+4;7=1+3+3;7=1+6;7=2+2+3
7=2+5;7=3+4;7=7

#include 
#include 
#include 
int N=0;//要分解的数字 
int num[30]={0};//用来存放分解的子项 :N最大值为30,因此最多30个子项 
int length=0; //分解后的个数 
int cnt=0;//输出的次数 
int division(int sub,int length); //sub表示N减去已分解的子项所剩的值 :为0的时候表示已经分解完一种可能性了,可以输出子项 
int main() {
scanf("%d",&N);
int sub=N;
division(sub,0); 
    return 0;
}
int division(int sub,int length)
{
 if(sub==0)//子项之和已经等于N了,就输出拆分的子项 
 {
  /*
  输出样例:
 7=1+1+1+1+1+1+1;7=1+1+1+1+1+2;7=1+1+1+1+3;7=1+1+1+2+2
 7=1+1+1+4;7=1+1+2+3;7=1+1+5;7=1+2+2+2
 7=1+2+4;7=1+3+3;7=1+6;7=2+2+3
 7=2+5;7=3+4;7=7//最后结尾的时候(length==1)没有; 
  */
  cnt++;
  printf("%d=%d",N,num[0]); 
  if(length>1)
  {
   int j=1;
   for(;j<=length-1;j++)
   {
    printf("+%d",num[j]);  
   } 
   
   if(cnt%4!=0)
   {
    printf(";"); 
   }
   if(cnt%4==0)
   {
    printf("\n"); 
    } 
  }
  if(length==1)
  printf("\n"); 
  
 }
 int i=1;
 for(;i<=sub;i++)//递归拆分子项 
 {
  if(length==0||(length!=0&&num[length-1]<=i))//避免出现7=3+4----4+3因此后面的子项一定要比前面这项大 
  {   
   num[length]=i;
   length++; 
   sub=sub-i;
   division(sub,length);// 拆分完一种可能   
   length--;
   sub=sub+i;//复原到原始的,以便尝试新的拆分 
   num[length]=0; 
   
  } 
 } 
}

你可能感兴趣的:(C语言学习-基础编程题,c语言,算法)