当前位置: 首页>>算法&结构>>正文


将一个正整数表示为连续自然数的和(附C实现源码)(原创)

丹阳 算法&结构, 算法的力量 , 去评论

问题描述:将一个正整数表示为两个或这个两个以上的连续自然数的和。给定一个数,输出所有的可能的结果。
例如:
3=1+2;
9=4+5;
9=2+3+4;
解决方法:
对于给定的整数n,求解基本思路如下,
1)用两个变量slow和fast分别表示连续自然数的最小数和最大数;
2)首先令slow=1,fast=2,他们是可能表示为n的初始集合。
3)while(slow < fast)
当slow到fast的和大于n时,令slow++,相当于从集合中删掉较小的元素;
当slow到fast的和小于n时,令fast++,相当于添加新元素到集合
当slow到fast的和等于n时,输出slow到fast之间(包括slow和fast)的整数,即要求的连续自然数;并且令slow++(求下一组)
C语言实现的的源码如下(VC编译器)


#include 
#include 
//将一个整数表示为连续自然数的和,例如:
//3=1+2
//9=4+5
//9=2+3+4


void pnt(int n, int low, int fast)
{
    printf("%d=",n);
    int i;
    for(i = low; i < fast; ++i)
        printf("%d+", i);
    printf("%d", fast);
    printf("\n");
}

//时间复杂度O(N)

//找到结果集返回1

//否则返回0
int gen(int n)
{
    int ret = 0;//·µ»ØÖµ
    int slow = 1;
    int fast = 2;
    int sum = 3;
    while(slow < fast)
    {
        if(sum > n)
        {
            sum -= slow;
            slow++;
        }
        else if(sum < n)
        {
            fast++;
            sum += fast;
        }
        else
        {
            ret = 1;
            pnt(n, slow, fast);
            sum -= slow;
            slow++;
        }
    }
    return ret;
}

//testing
int main()
{
    int i;
    for(i = 1; i <= 20; ++i)
    {
        if(gen(i) == 0)
        {
            printf("%d=N/A\n", i);
        }
        printf("-----------------------------------\n");
    }
    system("pause");
    return 0;
}

运行结果如下:
44

本文由《纯净的天空》出品。文章地址: https://vimsky.com/article/166.html,未经允许,请勿转载。