一些ACM的基础知识


int的数据范围:-2147483648~2147483647[-2^31~2^31-1]

long long范围:-922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807 (922*10^16)

最近做题的时候,经常遇到范围是2^63,取模2^64的这种题目。遇到这种限制条件时就要想到用unsigned long long类型。

可以简洁地声明为typedef unsigned long long ull。这样,如果ull类型的整数溢出了,就相当于取模2^64了。因为ull的范围是[0,2^64-1]。

而ll的范围是[-2^63,2^63-1],因为有符号的第63位表示“正负”而不表示数值E表示的是10的次方,

E后面的数字表示的是10的几次方,所以2E9等于2*10^9,也就是20亿。

memset(f,127,sizeof(f));

 我们在很多程序中都会看到memset(a,127,sizeof(a));这样的代码,127是什么特别的数字呢?通过基础的进制转换可以得知127的二进制表示是01111111,那么在dp数组里放的内容就是“01111111 01111111 01111111 01111111”,(10进制的2139062143),这样就实现了将数组里的全部元素初始化为一个很大的数的目的了,在最短路径问题以及其他很多算法中都是需要用到的。值得注意的是,int类型的范围为2^31-1,大约是2147483647的样子(如果我没有记错的话),所以初始化int类型的数组也可以使用127这个数值。

如果是128呢?因为128的二进制是10000000,那么放的内容就是10000000 10000000 10000000 10000000,经过计算可得这个数是-2139062144。这样就可以将数组初始化为一个很小的数了。

1<<30 表示1左移30位,每左移一位乘以2,所以就是1*2^30=1073741824。

程序提交错误原因

所以发生浮点错误应该考虑程序中:

是否可能出现了一个数除以0的情况
是否可能出现了一个数取余0的情况
是否发生了数据溢出而导致的除以0或者取余0的情况

相关