洛谷歷險記1(小數精確問題)

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,再進行除法操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章