问题描述:给定一个正整数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);
}