演算法競賽入門經典 第二章 如何判斷整數

2021-05-22 06:23:49 字數 1081 閱讀 6833

/*date : 2010 - 4- 15*/

例題2-1  輸出所有形如aabb的四位完全平方數(即前兩位數字相等,後兩位數字也相等)

一.思路1: 

該題的大體思路是十分清晰的,即" 迴圈 + if "的搭檔進行篩選.  

具體點說就是通過2重迴圈將所有aabb數枚舉出來,再通過if來篩選出是完全平方數的數. 

實現:這裡提到了乙個常用的功能實現:如何判斷乙個數是否是整數的問題.

原始的思路是利用floor(x)來取x的整數部分,再與x相比較,如果二者相等,則x是整數,反之則不是.

這裡需要注意的乙個問題是float型資料的精度問題,在大量計算中,由於float型對於

無限小數的運算也是屬於近似運算,所以存在一定的誤差,很容易出現的問題是:原本結果是1的,

得出的結果卻是0.999999999.然而floor之後卻變成了0,顯然這是不正確的.因此需要處理這

種由精度引起的誤差問題.

書中給出的方法是+0.5.這樣就能很巧妙地避開上述的錯誤.原因如下:

i) 當x是整數時,加上0.5後變成x.5,再用floor處理後,仍然是x.可判斷相等

ii)當x是小數時,加上0.5後再經過floor後變成整數,可判斷不相等

iii)當x是類似於0.99999999的小數時,加上0.5後經過floor變成1,可判斷相等

這裡需要指出的一點是if判定相等的問題.當比較0.9999999與1時,會判定不相等.

當比較0.9999999與1時,會判定相等.(編譯器是mingw3.4.5) 

即判斷乙個數x是否是整數的表示式: if(floor(x + 0.5) == x)

二.思路2

前面的思路是先將aabb形式的數枚舉出來,再用完全平方這個條件篩選.當然,我們

也可以先將一些數的完全平方計算出來,再判斷是不是aabb型的數.

二者順序不同,結果一樣.

這段**用到了我們平常程式設計比較少用到的continue語句,由continue和break組成的判斷

組合可以做類似的定界判斷.也可以好好體會下這種用法.

演算法競賽入門經典第二章

123 4567 891011 1213 1415 1617 1819 2021 2223 2425 2627 2829 3031 3233 3435 3637 3839 4041 4243 4445 4647 4849 5051 5253 5455 5657 5859 6061 6263 6465...

演算法競賽入門經典第二章上機以總結

2 1 題目 輸入乙個不超過10 9的正整數,輸出它的位數。例如12735的位數是5。請不要使用任何數學函式,只用四則運算和 迴圈語句實現 include include int main int argc,char argv printf 位數為 d n k 2 2 輸出100 999中的所有水仙...

演算法 《演算法競賽入門經典》第二章 示例及答案

輸出1,2,3 n的值 includeint main aabb 輸出所有形如aabb的4位完全平方數 即前兩位數字相等,後兩位數字也相等 7744問題 版本一 開平方看平方根是否為整數 include includeint main return 0 程式2 3 7744問題 版本二 列舉平方根 ...