當前位置: 首頁>>算法&結構>>正文


將一個正整數表示為連續自然數的和(附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/zh-tw/article/166.html,未經允許,請勿轉載。