将任意证书N分解成多个互不相同的正整数的和,并打印所有可能的组合方式。例如N=6,组合方式有1+5,2+4,1+2+3。
#include "stdafx.h"
#include "stdlib.h"
static int n;
int *a;
static int total =0 ;
void output(int s){
int i=1;
printf("%d = %d",n,a[i]);
for(i=2; i<=s; i++){
printf("+%d",a[i]);
}
printf("/n");
}
int filter(int s){
int i,j;
if(s==1)return -1;
for(i=s;i>0;i--)
for(j=1;j
if(a[i]==a[j])
return -1;
}
return 0;
}
void dfs(int d,int low,int rest){
//printf("d = %d ,low = %d ; rest =%d/n",d,low,rest);
int i;
if(rest == 0){
if(filter(d-1)==0){
total ++;
output(d-1);
}
}
if(low>rest) {
//printf("1111111111111/n");
return ;
}
for(i=low;i<=rest;i++){
a[d]=i;
dfs(d+1,i,rest-i);
}
}
int main(int argc, char* argv[])
{
int num;
printf("input:");
scanf("%d",&num);
n=num ;
a =(int *)malloc(sizeof(int)*(n+1));
dfs(1,1,n);
printf("total = %d/n",total);
free(a);
return 0;
}