标签:
输入整数(0-30)分解成所有整数之和。每四行换行一次。
一种方法是通过深度优先枚举出解。通过递归的方式来实现。
#include <stdio.h> #include <string.h> #define MAXN 30 #define MAXString 64 int Terms[MAXN]; int N; int Count; void Search(int Remainder,int Start,int nTerm) { int i; if(Remainder ==0 ){ Count++; if(Count%4!=1) printf(";"); printf("%d=%d",N,Terms[0]); for(i=1;i<nTerm;i++) printf("+%d",Terms[i]); if(Count%4==0) printf("\n"); } else { for(i=Start;i<=Remainder;i++){ Terms[nTerm]=i; Search(Remainder-i,i,nTerm+1); } } } void Test1() { scanf("%d",&N); Count=0; Search(N,1,0); if(Count%4!=0) printf("\n"); } void Search1(int Remainder, int Start,char *STerms) { int i; char Tmps[MAXString]; strcpy(Tmps,STerms); for(i=Start;i<=Remainder;i++) { if(Remainder-i>=i) { sprintf(Tmps+strlen(STerms),"%d+",i); Search1(Remainder-i,i,Tmps); }else if(Remainder-i==0) { sprintf(Tmps+strlen(STerms),"%d ",i); Count++; if(Count%4!=1) printf(";"); printf("%s",Tmps); if(Count%4==0) printf("\n"); } } } void Test2() { char STerms[MAXString]=""; int N; Count=0; scanf("%d",&N); Search1(N,1,STerms); if(Count%4!=0) printf("\n"); }
第二种方法是试探下一次是否达到边界,避免了第一种方法的多次无效递归。
标签:
原文地址:http://www.cnblogs.com/chentingk/p/5371539.html