《程式設計之美》 2 21只考慮加法

2021-07-27 05:18:25 字數 1144 閱讀 6338

我們知道:

1+2 = 3;

4+5 = 9;

2+3+4 = 9。

等式的左邊都是兩個或兩個以上連續的自然數相加,是不是所有的整數都可以寫成這樣的形式呢?

問題1:  對於乙個64位正整數,輸出它所有可能的連續自然數(兩個以上)之和的算式。

問題2:  大家在測試上面程式的過程中,肯定會注意到有一些數字不能表達為一系列連續的自然數

之和,例如32好像就找不到。那麼,這樣的數字有什麼規律呢?能否證明你的結論?

問題3: 在64位正整數範圍內,子串行數目最多的數是哪乙個?

問題一解法:雙指標遍歷

這題有兩種解法, 其中一種便是雙指標法,還有一種比較巧妙,利用了數學方法,簡單來說是求出乙個公式來。這裡只說雙指標的解法。

這裡需要乙個轉化,把求n中所有可能的連續自然數之和歸約為在陣列中找所有連續子串行和等於n的問題。這裡同樣也是這樣乙個場景:對有序陣列如何遍歷來求得符合要求的資料集合?這時的雙指標可以不是一頭一尾了,而是兩個都指向頭部,這樣可以以高效的順序遍歷我們要找的所有集合。初始設i=j=1,這裡同樣會出現三種情況:

sum[i,j] == sum, 直接輸出i到j的值,並把i+1,j+1,因為只是i+1肯定是不等的,因為和小了,同樣j+1只會使和變大,所以兩個都要往前加(注意這裡指標不用考慮減小,因為這在以前就考慮過了)

sum[i,j] < sum,說明偏小,那麼提高j來使得和變大才有可能相等

sum[i,j] > sum,說明偏大,那麼提高i來使得和變小才有可能相等

這樣,**就出來了:

public static void getanswer(int n)

else if (sum < n) //sum[i..j]n,只能提高i以減小sum

}}

所謂雙指標,是利用兩個指針對乙個有序陣列進行遍歷,查詢出符合要求的資料集合。相信大家都接觸到了這種思維模式的解題方法,只是沒有注意到罷了。

只考加法 程式設計之美2 21

我們知道 1 2 3 4 5 9 2 3 4 9 等式左邊都是兩個以上連續的自然數相加,那麼是不是所有的整數都可以寫成這種形式呢?寫乙個程式,對於乙個32位正整數,輸出它所有的連續自然數之和的算式。可以發現任意自然數序列其實是公差為1的等差數列,那麼數列前n項和公式有a1 n n n 1 2 sn,...

程式設計之美2 21 加法

題目 我們知道 1 2 3 4 5 9 2 3 4 9 等式左邊都是兩個以上連續的自然數相加,那麼是不是所有的整數都可以寫成這種形式呢?問題1.寫乙個程式,對於乙個64位正整數,輸出它所有可能的連續自然數 兩個以上 之和的算式 問題2.有的數例如32就找不到這樣的表達,這樣的數字有什麼規律?問題3....

程式設計之美2 21 加法

題目 我們知道 1 2 3 4 5 9 2 3 4 9 等式左邊都是兩個以上連續的自然數相加,那麼是不是所有的整數都可以寫成這種形式呢?問題1.寫乙個程式,對於乙個64位正整數,輸出它所有可能的連續自然數 兩個以上 之和的算式 問題2.有的數例如32就找不到這樣的表達,這樣的數字有什麼規律?問題3....