一些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亿。
数据类型 | 数据范围 | 数量级 |
---|---|---|
unsigned int | 0~42 9496 7295 | 42亿 10位 |
int |
-21 4748 3648~21 4748 3647 | 2 ∗ 1 0 9 2*10^92∗109 |
unsigned long | 0~42 9496 7295 | 42亿 10位 |
long (32位系统) | -21 4748 3648~21 4748 3647 | 21亿 |
long long的最小值 | -922 3372 0368 5477 5808 | 19位 |
long long 的最大值 |
922 3372 0368 5477 5807 | 9 ∗ 1 0 18 9*10^{18}9∗1018 |
unsigned long long | 0~1844 6744 0737 0955 1615 | 20位 |
float(浮点型) | 3.402823E-38~3.402823E+38 | 38位 |
double(浮点型) | 1.79769313486232E-308 ~1.79769313486232E+308 | 308位 |
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的情况
~i等价于i>=0,因为-1取反为0
sort(a ,a + len, greater<int>()); //内置类型的由大到小排序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现