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