題目如下: --------------------------------------------------看了這麼多題目,有人不禁會想,這些題目都太難了!有沒有容易的?這裡有一題,只用到加法,大家別嫌題目簡單,不妨試試看。我們知道:1+2=34+5=92+3+4=9等式左邊都是兩個以上連續的自然數相加,那麼是不是所有的整數都可以寫成這樣的形式呢?稍微考慮一下,我們發現,4、8等數並不能寫成這樣的形式。問題1:寫一個程式,對於一個64位正整數,輸出它所有可能的連續自然數(兩個以上)之各的算式。問題2:大家在測試上面程式的過程中,肯定會注意到一些數字不能表達為一系列連續的自然數之和,例如32好像就找不到。那麼,這樣的數字有什麼規律呢?能否證明你的結論?問題3:在64位正整數範圍內,子序列數目最多的數是哪一個?這個問題要用程式蠻力搜尋,恐怕要運行很長時間,能否用數學知識推匯出來?--------------------------------------------------
我的解答
解答1:
程式就不寫了,基本思路就是對於給定的數N,遍曆2~N的數,滿足條件就輸出。這樣的話複雜度是
O(N)。做一些最佳化,發現 i = 2~N 增長到一定程度後,會出現其邊緣序列已經超出整數範圍,故後面的值不用再遍曆,可直接退出迴圈。這樣最佳化後,測試發現N=10^7時需迴圈4470次,比O(N)好了許多。 進一步進行理論分析如下:設N = k*m ,k表示k個數之和,m表示序列的中點數(若k為偶數則m的小數部分必須為0.5才有解)由於序列起點至少為1,所以有 m - (k + 1)/2 >= 0 (*) 將 m = N/k 代入上式,整理得 k^2 + k - 2*N <=0,解得 0 < k <= ( sqrt(1 + 8 * N) - 1) / 2不等式右側就是k取值的上界,由此可將演算法改進,時間複雜度降為
O(sqrt(N)) 解答2:嚴格證明,我是不會呵,闡述下思路吧先說下我的答案,是2的冪次的數均不可。證明如下:(1)奇數都可以,因為任意奇數都可以拆為k + (k + 1)的形式,從而有解(2)由對稱性可知,凡是能被2整除的偶數,均不能表示為兩個數之和的形式,推廣得對於數N,若要將其表示為長度k的序列(當然k不能超過上述解答1的上界),必須有 N % k == k/2,該式其實與N被偶數除,結果小數部分必須為0.5是等價的 可知,對於任意數N,若可以表示為2^x * y,y表示除2以外因子的乘積,則在k滿足上界限制的前提下,k = 2^(x+1)一定有解。反推之,對於任意2的冪次的數,均無解。 解答3:由解答1可知,k的上界與N有關,N越大則k的取值範圍越大,可能的序列數目就越多。因此,由貪心策略得,最大值MAX應具有如下形式 MAX = 3^n 由於是64位整數,有 3^n < 2^64 解得 n < (ln2/ln3)*64 ,n是整數,n最大值是40 所以有MAX = 3^40再由解答1得,序列數最多為20*2 = 40個