一個數拆分成連續自然數的和(只考加法的面試題)

題目:給定一個自然數,如何將它拆分成幾個連續的自然數的和的形式,例如:9 = 4 + 5,12 = 3 + 4 + 5等,有哪些數不能分解成這樣的形式,例如4,8等

分析:通過上面的幾個例子可以發現一下規律:

1)所有的奇數n都可以分解成(n/2) + (n/2 +1)

2)偶數有點麻煩,先對部分例子進行計算,比如6 = 1 + 2 + 3,10 = 1 + 2 + 3 + 4, 12 = 3 + 4 + 5,  30 = 9 + 10 + 11 = 4 + 5 + 6 + 7 + 8,我們發現如果n能夠被一個奇數整除,例如12/3 = 4,12可以被3整除,那麼構造方案就可以以商爲中心向兩邊擴展,每次過看都增加2個數,而這兩個數的和/2剛好爲商,這樣就可以有奇數個商相乘,剛好等於被除數,這是一種構建方法。但這種方法有時會有問題,比如10,它可以被奇數5整除,但按照上面的構建策略會有問題,經過分析發現,上面構造的方法,結果一定是奇數個數相加,而10的構建是偶數個數相加。對於這類數,我們如何處理呢?經過舉例歸納我們發現,如果一個數被2整除後商是奇數,那麼可以這樣來構建,因爲兩個這樣的奇數加起來可以得到n,而奇數的構建可以通過(n/2) + (n/2 +1)來構建起來,那麼我們知道數列((n/2) -1 ) 與(n/2+1) +1 的和等於(n/2) + (n/2 +1),而這4個數都是連續的。經過上面的分析,我們可以構建所有n/2爲奇數的情況,以及n可以被某個奇數整除的情況,但我們一直不能處理n不能被某個奇數整除的情況,事實上這種數如2,4,8, 16,...,2^n是不能拆分的,下面來證明爲什麼會這樣。

3)證明2^n不能拆分成題目要求的形式,我們可以相像,拆分後的數字個數要麼爲奇數個要麼爲偶數個。

先看拆分爲奇數個數的情況,假設拆分成a[1]+ a[2]+ ...+ a[j]其中j爲奇數,那麼(a[1]+a[j]) = (a[2]+a[j-1])=...= a[(1+j)/2],這些數相加剛好等於((1+j) +1) *a[(1+j)/2]因爲j位奇數,j+2也爲奇數,也就是說n有一個奇數的因子;

再看拆分爲偶數個數的情況,假設拆分成a[1]+ a[2]+ ...+ a[j]其中j爲偶數,那麼(a[1]+a[j]) = (a[2]+a[j-1])=...= (a[j/2] + a[j/2+1]),這些數相加的和等於(j/2)*(a[j/2] + a[j/2+1]),我們知道(a[j/2] + a[j/2+1])是相鄰的自然數,必定一個爲奇數一個爲偶數,所以(a[j/2] + a[j/2+1])必定爲奇數,也就是說n有一個奇數的因子;

這兩種情況都證明了n如果能夠被拆分,一定含有一個奇數的因子,而2^n恰好不含有奇數的因子,因此不能被拆分。

參考文獻

編程之美2.21

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