整数分解 && 质因数分解
输入整数(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"); }
第二种方法是试探下一次是否达到边界,避免了第一种方法的多次无效递归。
质因数分解,输入大整数long int并分解其为素数的乘积
//整数分解成素因子 void Decomposed(long int data){ int i; int si=0; int temp=data; for(i=2;i<=temp;i++){ if(temp!=i) { while(true){ if(temp%i==0 && temp/i!=1){ printf("%d*",i); temp/=i; //printf("temp=%d,i=%d\n",temp,i); }else if(temp%i==0 && temp/i==1){ printf("%d",i); temp/=i; //printf("temp=%d,i=%d\n",temp,i); } else break; } }else{ printf("%d\n",i); si=1; } } if(si==0) printf("\n"); } void TestDecomposed(){ long int x=1000234; printf("%ld=",x); Decomposed(x); }