[原]編程之美2.21 只考加法的面試題

來源:互聯網
上載者:User

題目如下: --------------------------------------------------看了這麼多題目,有人不禁會想,這些題目都太難了!有沒有容易的?這裡有一題,只用到加法,大家別嫌題目簡單,不妨試試看。我們知道: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個

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.