码迷,mamicode.com
首页 > 其他好文 > 详细

整数分解

时间:2016-04-09 15:10:31      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

输入整数(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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!