一些易错的地方
NO.1 移位运算
long long x= 1<<62; (错)
正解:long long x=(long long )1<<62; 值为:4611686018427387904 大于1e18,大概是1e18的4倍。
即是:二进制下1后面62个0,共63位。
NO.2 math.h
sqrt()
double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。能绝对保证15位;数值范围:-1.7*10^-308~1.7*10^308
long double:精度为18~19位,能绝对保证18位。;数值范围:-1.2*10^-4932~1.2*10^4932
超出范围一定要自己写二分!!!
pow()
double pow(double x, double y);
float powf(float x, float y);
long double powl(long double x, long double y);
没有int型的一定要考虑误差,千万不能 int i=pow(10,5);这种写法,答案可能是99999.
不能把浮点型赋值给整形。因为浮点型是一个近似表示。
NO.3 #define swap(a,b) (a^=b^=a^=b)
要注意判断a=a的情况,也就是swap(a,a),比如swap(a[i],a[j]) i==j的情况