一道簡單的作業題的延伸,最優化的演算法

2021-06-28 02:25:36 字數 659 閱讀 8016

題目:

2^0+2^1+2^2+2^3+2^4....+2^31

2的次方相加,不要使用math庫的pow函式

"譚浩強"版,效率最低,兩次遍歷

#includeint main(void)

printf("sum=%lld\n",sum);

}

最優化版,位運算

#include int main(int argc, char** argv) 

printf("%ld\n", sum);

}

tips:

不能用 double,浮點格式無法準確表示大多數整形數,而且效能差,更不能用 裡的 pow() 函式了。

不能用 int。 現在的x86和amd64平台,基本上 int 就是 32 位的了,題目要加到 2^31 次方,signed int 已經溢位了。不過正好在 unsigned int 範圍裡。為安全可以用 unsigned long 。

但是算 2^31 用迴圈的都是偽電工,(1 << 31) 就是 2^31 了…………

順便提及c語言沒有冪運算子,(2 ^ 31) 這個表示式在c語言裡結果是29。

公式:2^32-1

不用迴圈的bt寫法...printf("%u\n", ~0);

一道作業題

時間限制 1000 ms 記憶體限制 64 mb 題目描述 初始有乙個數n,每過一秒所有大於1的數x都會 成3部分 x 2 x 2 x 2 問經過足夠長的時間後,即所有的數都是0或1的時候,0的個數是多少.輸入資料 乙個正整數n,n 1e12 輸出資料 最終0的個數 樣例輸入 5樣例輸出 2樣例說明...

一道演算法作業題(續)

在乙個圓形操場的四周擺放著n堆石子,現要將石子有次序地合併成一堆。規定每次只能選擇相鄰的兩堆石子合併成新的一堆,並將新一堆石子數記為該次合併的得分。試設計乙個動態規劃演算法,計算出將n堆石子合併成一堆的最小得分和最大得分,要求列出遞迴方程,寫出演算法的偽 並分析演算法的時間空間複雜性。要求每次合併必...

最近做的一道c 作業題

今天突然想到,接觸這玩意快一年了,結果還是弱雞乙隻。一直跟自己說慢慢來,但是覺得,還是不能慢慢來,雖然想好好學習,但一直只是想。有時候想什麼高數什麼大物都不寫,但是囿於現實,沒辦法。沒地方說事情就在這裡巴拉巴拉一大堆先。看題吧 實驗內容 實驗 編寫乙個人員資訊管理系統。這個系統的功能是 互動式的實現...