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

2022-01-10 07:53:02 字數 1332 閱讀 9193

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

乙個正整數有可能可以被表示為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-1)/2)%n==0,這樣就很容易判斷乙個數可不可以寫成連續n個自然數的形式了,遍歷n=2…sqrt(m)*2,還可以輸出所有解。

void divide(int

num)

cout

<}

}

}

第二個問題是什麼樣的數可以寫成連續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。

若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.

若b是偶數,則我們有乙個奇數a和乙個偶數b。

上述兩個不等式必然至少有乙個成立,所以可以證明,只要m有乙個奇數因子,就一定可以寫成連續n個自然數之和。

另乙個正整數分解的演算法:

sum(i,j)為i累加到j的和 

令 i=1 j=2 

if sum(i,j)>n i++ 

else if sum(i,j)

#include using

namespace

std;

int add(int m,int

n)

void divide(int

num)

for(int k=i;k<=j;k++)

cout

<"

";

++i;

cout

<}

}

intmain()

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

題目 輸入乙個正整數,若該數能用幾個連續正整數之和表示,則輸出所有可能的正整數序列。乙個正整數有可能可以被表示為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 n 2 個連續正整數之和,如 15 1 2 3 4 5 15 4 5 6 15 7 8 有些數可以寫成連續n 1 個自然數之和,比如14 2 3 4 5 有些不能,比如8.那麼如何判斷...

演算法 正整數分解為幾個連續自然數之和

題目 輸入乙個正整數,若該數能用幾個連續正整數之和表示,則輸出所有可能的正整數序列。乙個正整數有可能可以被表示為n n 2 個連續正整數之和,如 15 1 2 3 4 5 15 4 5 6 15 7 8 有些數可以寫成連續n 1 個自然數之和,比如14 2 3 4 5 有些不能,比如8.那麼如何判斷...