p1422
關於精度問題:要求最後的取值要精確到小數點後一位。
//fea = ((int)((fea * 10) + 5 ))/10.0; 錯誤示範
fea = int((fea * 10) + 0.5) / 10.0;
註釋的一行是錯誤的代碼
分析:例如最後得到的是一個1.05的double類型,1.05*10=10.5,再加5則影響了小數點後一位的精度,實則應該在小數點後的第二位增加,即增加0.5.
同時,還可以使用floor函數,即返回一個小於或等於該數的一個最大整數,正好用來去掉小數點後面的部分(需要引入cmath包)
fea = floor((fea * 10) + 0.5) / 10.0;
另解:添加頭文件#include<iomanip> 該頭文件可以用來設置輸出的精度
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main() {
double x = 1.28456;
cout << fixed << setprecision(1);//fixed標識啓用準確計數,setprecision則是設置精確度
cout << x;
return 0;
}
p1085
關於如何去獲取int的最大值:
unsigned int a = 0;
int MAX = (~a)/2;
分析:無符號數0的二進制位全0,取反後爲全1,再除以二則右移,得到首位爲0,其一皆是1的二進制數。(取反操作不會變化變量類型,僅僅將其按位變化,而無符號數的算術右移則首位補0)
習得ceil函數!返回一個大於或等於該數的最小整數
temp = ceil (n*1.0) / a[i];
注意:對於符號類型強轉,存在其優先級:,在該例子中是現將後面括號內的部分強轉爲int,再進行除法操作。