ACM小技巧

(更新—ing)

1、memset是对字节进行操作,每个字节相同时可以用memset(一个字节有8位),比如(int型的):0x3f3f3f3f、0、-1,,,(-1是按反码存的,每一位都是1);所以memset不能赋1,比如memset(&a,1,sizeof(int));实际上给a赋的是00000001000000010000000100000001(2)=16843009。

2、位运算:
       a&1          \implies 相当于a%2==1(判断奇偶性);
       a^b         \implies 相当于a!=b(判断a,b是否相等)
       1<<n       \implies 2n

3、long long的输出:c/c++下 long long与__int64不同编译环境的比较

4、c++中可以在for后的括号中定义变量,c中不行

5、输出一个换行:Puts(""); cin<<end1; printf("\n");

6、c中sqrt()函数的实型参数可以是整型,c++中不行,不然会编译错误

7、||(一真则真)运算中,第一个为真就不会判断第二个了;&&(一假则假)运算中,第一个为假也不会继续判断第二个

8、printf是用栈实现的,所以int i = 8;printf("%d %d", i++, i- -);的输出结果是:7 8

9、访问数组或容器时要先判断下标是否越界,多组输入记得清空stl

10、错排公式D(n) = (n-1) [D(n-2) + D(n-1)],特殊地,D(1) = 0, D(2) = 1.

11、int dir[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};//按此顺序搜索出来的结果就是字典序

12、计算序列全排列的函数:next_permutation(start,end)(当前排列的下一个排列),和prev_permutation(start,end)(当前排列的上一个排列)。

13、来自:ACM的小技巧
读到文件的结尾,程序自动结束(scanf成功输入一个数据返回1,否则返回-1)
while( ( scanf(“%d”, &a) ) != -1 )
while( ( scanf(“%d”, &a) ) != EOF)
while( ( scanf(“%d”, &a) ) == 1 )
while( ~( scanf(“%d”, &a) ) )//位运算
读到一个0时,程序结束
while( scanf(“%d”, &a) , a)
while( scanf(“%d”, &a)!=EOF && a)
读到多个0时,程序结束
while( scanf(“%d%d%d”, &a, &b, &c), a+b+c ) //a,b,c非负

14、gets()是返回一个指针的,如果读到了文件末尾就返回空了,也就是NULL

15、ceil(),floor()返回值是double类型的

16、 对于upper_bound来说,返回的是被查序列中第一个大于查找值的指针,也就是返回指向被查值>查找值的最小指针,lower_bound则是返回的是被查序列中第一个大于等于查找值的指针

17、1B=8b,1kb=1024b

18、数据范围或值较大时,若出现wa,注意数据是否溢出(超出int的范围)

19、除vector和string以外的STL都不支持*(it+1)的访问形式

20、正数的反码与其原码相同,负数的反码是对正数逐位取反,符号位保持为1;
正数的补码与其原码相同,负数的补码是在其反码的末位加1;

21、整数和整数的运算结果是整数(不会是浮点数)
int型整数和int型整数的运算结果是int整数(不会是长整型long long)

22、define是文本替换,和子函数不一样

23、Runtime Error,指你的程序发生了运行时错误。可能是由于内存访问违规(数组下标越界也包括运行时下标为负数的情况)、除0等运行时问题。

24、两个变量交换:a ^= b ^= a ^= b

25、lowbit函数 : x & (-x) 或者 (x - (x & (x - 1)))

26、判断是不是2的幂:x > 0 ? ( x & (x - 1)) == 0 : false

发布了52 篇原创文章 · 获赞 26 · 访问量 3195

猜你喜欢

转载自blog.csdn.net/qq_43803508/article/details/95863612