正整數分解爲幾個連續自然數之和

題目:輸入一個正整數,若該數能用幾個連續正整數之和表示,則輸出所有可能的正整數序列。

一個正整數有可能可以被表示爲n(n>=2)個連續正整數之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8

有些數可以寫成連續N(>1)個自然數之和,比如14=2+3+4+5;有些不能,比如8.那麼如何判斷一個數是否可以寫成連續N個自然數之和呢?

一個數M若可以寫成以a開頭的連續n個自然數之和,則M=a+(a+1)+(a+2)+…+(a+n-1)=n*a+n*(n-1)/2,要求a!=0,否則就是以a+1開頭的連續n-1個整數了,也就是要求(M-(n+n*(n-1)/2))%n==0,即(M-(n*(n+1)/2))%n==0,這樣就很容易判斷一個數可不可以寫成連續n個自然數的形式了,遍歷n=2…sqrt(M)*2,還可以輸出所有解。
void divide(int num)
{
    int i,j,a;
    for(i=2; i<=sqrt((float)num)*2; ++i)
    {
        if((num-i*(i-1)/2)%i==0)
        {
            a=(num-i*(i-1)/2)/i;
            if(a>0)
            {
                for(j=0; j<i; ++j)
                    cout<<a+j<<" ";
            }
            cout<<endl;
        }
    }
}



第二個問題是什麼樣的數可以寫成連續n個自然數之和,什麼樣的數不能?
通過編程實驗發現,除了2^n以外,其餘所有數都可以寫成該形式。下面說明爲什麼。
若數M符合條件,則有M=a+(a+1)+(a+2)+…+(a+n-1)=(2*a+n-1)*n/2,而2*a+n-1與n肯定一個爲奇數一個爲偶數,即M一定要有一個奇數因子,而所有2^n都沒有奇數因子,因此肯定不符合條件。
再證明只有M有一個奇數因子,即M!=2^n,M就可以寫成連續n個自然數之和。假設M有一個奇數因子a,則M=a*b。
1)若b也是奇數,只要b-(a-1)/2>0,M就可以寫成以b-(a-1)/2開頭的連續a個自然數;將這條結論裏的a和b調換,仍然成立。15=3*5=1+2+3+4+5=4+5+6.
2)若b是偶數,則我們有一個奇數a和一個偶數b。
2.1)若b-(a-1)/2>0,M就可以寫成以b-(a-1)/2開頭的連續a個自然數。24=3*8=7+8+9.
2.2)若(a+1)/2-b>0,M就可以寫成以(a+1)/2-b開頭的連續2*b個自然數。38=19*2=8+9+10+11.
上述兩個不等式必然至少有一個成立,所以可以證明,只要M有一個奇數因子,就一定可以寫成連續n個自然數之和。

另一個正整數分解的算法:
/*
sum(i,j)爲i累加到j的和
令 i=1 j=2
if sum(i,j)>N i++
else if sum(i,j)<N j++
else cout i...j
*/
C++實現:

#include <iostream>
using namespace std;

int add(int m,int n)
{
    int sum=0;
    for(int i=m; i<=n; i++)
        sum+=i;
    return sum;
}

void divide(int num)
{
    int i=1,j=2,flag;
    int sum=0;
    while(i<=num/2)
    {
        sum=add(i,j);
        while(sum!=num)
        {
            if(sum>num)
                i++;
            else
                j++;
            sum=add(i,j);
        }
        for(int k=i; k<=j; k++)
            cout<<k<<" ";
        ++i;
        cout<<endl;
    }
}

int main()
{
    int num;
    cout<<"Please input your number:"<<endl;
    cin>>num;
    divide(num);
    return 0;
}

問題:是不是所有的正整數都能分解爲連續正整數序列呢?

答案不是。並不是所有的正整數都能分解爲連續的正整數和,通過編程實驗發現,除了2^n以外,其餘所有數都可以寫成該形式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章