问题描述:给定一个正整数N,输出所有和为N的正整数的组合。组合中不能出现重复的数字,并且没有顺序区别,即1,9和9,1是同一个组合。
示例:给定一个数9。
和为9的组合有:1、8
                1、2、6
                1、3、5
                2、7
                2、3、4
                3、6
                4、5
                9
输入:任意一个正整数N,N<=120
输出:打印出所有和为N的正整数组合以及组合的总数SUM,每行打印一个组合并要求各组合之间有序,便于检查对错,统计运行时间。
可以通过输入100来检验算法的效率,因为和为100的组合有40多万种。由于打印40多万行数据在控制台需要花很长时间,所以建议将结果输出到文件,方便检查。
#include <stdio.h>
#define MAX 100  
#define data 10 //以10为例进行拆数
int a[MAX];
int k=1;
 
void plus(int N,int m)
{
int i,j,s,sum;
if(m>=N/2) return;    //只循环到N/2,拆数组合无重复
for(j=1;j<k;j++)  //输出一行
 { if(N==a[j]) break;  //删掉有重复数字的行
   else if(j==k)     //无重复的组合
   {printf("\n%d=",data);
  {for(s=0;s<k;s++)  //输出符合条件的拆数组合
   printf("%d+",a[s]);
   printf("%d\n",N);
   }
 }
for(i=m+1;i<N/2;i++)//以第一个数字循环拆数
{
 sum=0;
 a[k]=i;    //数组a[]记录各个加数
 sum+=a[k]; //sum记录前几个加数之和
 k++;    
 plus(N-sum,i);
 }
}
main()
{
plus(data,0);
}

											