输入整数(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 == ){
Count++;
if(Count%!=)
printf(";");
printf("%d=%d",N,Terms[]);
for(i=;i<nTerm;i++)
printf("+%d",Terms[i]);
if(Count%==)
printf("\n");
}
else
{
for(i=Start;i<=Remainder;i++){
Terms[nTerm]=i;
Search(Remainder-i,i,nTerm+); }
}
}
void Test1()
{
scanf("%d",&N);
Count=;
Search(N,,); if(Count%!=)
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==)
{
sprintf(Tmps+strlen(STerms),"%d ",i);
Count++;
if(Count%!=)
printf(";");
printf("%s",Tmps);
if(Count%==)
printf("\n"); } }
}
void Test2()
{
char STerms[MAXString]="";
int N;
Count=;
scanf("%d",&N);
Search1(N,,STerms);
if(Count%!=)
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);
}