cin,cout 的箭头等等。
这个帖子不准水楼,务必要求真实。。。
逆元忘了判断模数是否为素数
数学期望勇敢地开了int数组
组合数没写逆元然后炸了
在用费马小定理和欧拉定理时忘了判断是不是素数(这方面我已经死了四五次了
开小数组 数据分治写挂 不开long long(int*int=int) 后缀数组不写倍增 忘记把暴力部分换掉 不删调试信息 不写pushdown&pushup 行末不输出回车 记忆化搜索不标记已搜过状态 算错复杂度 数组开大MLE(N<<20) 枚举子集写错[j=i&(j-1)] 清数组不彻底 忘记求逆元的复杂度 n和m搞反
字符串用单引号
但是很多事情就是不科学,嘻嘻~
要相信科学!c++也是一样。
对对对,129就是一个栗子。在我的电脑上,getchar比cin慢n倍,cin比scanf慢10倍,scanf比fread慢5倍,fread比解绑cin慢8倍(妥妥的不科学)
@chen_zhe 有一些题专门卡cin和cout
@root scanf/printf其实不比cin/cout快多少
memset初始化数组注意的地方:
如果是memset(a, 负数, sizeof(a));
那么a数组将全部初始化为你指定的负数。
可如果是memset(a, 正数, sizeof(a));
就不行了……
我做了一个实验:
#include <cstdio> #include <cstring> int a[10]; int main() { memset(a, 1, sizeof(a)); printf("%d", a[1]); }
输出结果很恶心。
但是,memset是内存复制,于是我尝试使用了以十六进制输出a[1](十六进制格式符是%x或%X)
#include <cstdio> #include <cstring> int a[10]; int main() { memset(a, 1, sizeof(a)); printf("%x", a[1]); }
输出结果: 1010101
似乎很有什么规律
把1改成2呢?
#include <cstdio> #include <cstring> int a[10]; int main() { memset(a, 2, sizeof(a)); printf("%x", a[1]); }
输出结果:2020202
改成3呢?3030303
改成4?4040404
于是我尝试了将1、2、3、4改为127
输出不是1270127
而是7f7f7f7f
8位了!
127的十六进制表示就是7f
改成10?
a0a0a0a
10的十六进制表示就是a
改成-1?
fffffff
一脸懵逼 1/10000
输出一下-1的十六进制?
-2的十六进制表示?
ffffffe
哇偶,奇怪
之前看过紫书上说,-n是使用补码表示法表示的,即使用 表示。这下也就解答了为什么int有32位,但是正数却只能表示到2 ^ 31 - 1
但是memset如果把数组初始化为-2,就像这样:
#include <cstdio> #include <cstring> int a[10]; int main() { memset(a, -2, sizeof(a)); printf("%x", a[1]); }
输出是fefefefe,不是fffffffe
这说明,memset的初始化的确是内存复制——是按照二进制来的。至于为什么十六进制能观察出结果,是因为2 ^ 4 = 16
有一天我就为memset废了3小时……
以上全部为本人亲身实验
但如果是longlong,cin和cout比scanf、printf快
共 141 条回复
逆元忘了判断模数是否为素数
数学期望勇敢地开了int数组
组合数没写逆元然后炸了
在用费马小定理和欧拉定理时忘了判断是不是素数(这方面我已经死了四五次了
开小数组 数据分治写挂 不开long long(int*int=int) 后缀数组不写倍增 忘记把暴力部分换掉 不删调试信息 不写pushdown&pushup 行末不输出回车 记忆化搜索不标记已搜过状态 算错复杂度 数组开大MLE(N<<20) 枚举子集写错[j=i&(j-1)] 清数组不彻底 忘记求逆元的复杂度 n和m搞反
字符串用单引号
但是很多事情就是不科学,嘻嘻~
要相信科学!c++也是一样。
对对对,129就是一个栗子。在我的电脑上,getchar比cin慢n倍,cin比scanf慢10倍,scanf比fread慢5倍,fread比解绑cin慢8倍(妥妥的不科学)
@chen_zhe 有一些题专门卡cin和cout
@root scanf/printf其实不比cin/cout快多少
memset初始化数组注意的地方:
如果是memset(a, 负数, sizeof(a));
那么a数组将全部初始化为你指定的负数。
可如果是memset(a, 正数, sizeof(a));
就不行了……
我做了一个实验:
输出结果很恶心。
但是,memset是内存复制,于是我尝试使用了以十六进制输出a[1](十六进制格式符是%x或%X)
输出结果: 1010101
似乎很有什么规律
把1改成2呢?
输出结果:2020202
改成3呢?3030303
改成4?4040404
于是我尝试了将1、2、3、4改为127
输出不是1270127
而是7f7f7f7f
8位了!
127的十六进制表示就是7f
改成10?
a0a0a0a
10的十六进制表示就是a
改成-1?
fffffff
一脸懵逼 1/10000
输出一下-1的十六进制?
fffffff
-2的十六进制表示?
ffffffe
哇偶,奇怪
之前看过紫书上说,-n是使用补码表示法表示的,即使用 表示。这下也就解答了为什么int有32位,但是正数却只能表示到2 ^ 31 - 1
但是memset如果把数组初始化为-2,就像这样:
输出是fefefefe,不是fffffffe
这说明,memset的初始化的确是内存复制——是按照二进制来的。至于为什么十六进制能观察出结果,是因为2 ^ 4 = 16
有一天我就为memset废了3小时……
以上全部为本人亲身实验
但如果是longlong,cin和cout比scanf、printf快