异或运算(a^b)的应用
2n+1个数中,n个数都出现了两次,怎么找剩下那一个数?所有数进行异或运算即可。利用性质a^b^b=a。
转关于while循环中的~scanf():
可以经常在ACM代码中看到 while(~scanf("%d",&n)){ } 这样的代码,意思是在读到输入结尾时循环也结束。
一般在读到输入流结尾时,scanf返回的是EOF。
EOF是在头文件stdio.h中定义的常量,一般为-1。
-1 的原码是10000001,反码是1111110,补码是11111111。复习一下,正数的原码、反码、补码都是一样的;负数的原码是符号位为1,反码是(对原码)符号位不变、其余位取反,补码是(对原码)符号位不变、其余位取反、末位加1.
~EOF则是对EOF进行按位取反操作,则为00000000。所以while条件不满足,循环结束。
注意Windows中cmd里用Ctrl+Z代表回车。
转ACM基础——OJ上的Java代码提交规范
1、输入
Scanner cin = new Scanner(System.in);
while(cin.hasNext()){
int a = cin.nextInt();
int b = cin.nextInt();
}
2、类名
public class Main {}
其他Java注意事项见PTA中提交Java程序的一些套路
转C语言数组下标太大怎么办?
当需要数组分配很大的空间,且为局部变量时,有可能会出现执行出错的情况。
这是因为,对于每个进程/线程,栈空间大小是有限的,而局部变量的内存是在栈上分配的,如果局部变量过大,则会出现分配失败的情况。
要解决这个问题,有两种方式:
1 将数组定义为全局变量。
全局变量分配时,会分配在全局变量空间,不受栈空间大小影响。
这种方法的好处是,代码简单,只需要将定义从函数内移动到函数外即可,其它不需要改变。
缺点是,在程序运行全程均需要占用该部分内存,很多时候这是一种浪费。
2 使用动态内存空间。
通过malloc,calloc, zalloc等函数,可以分配动态内存空间。该空间会分配在堆上,同样不受栈空间的限制。
不过这种方法使用后,必须通过free函数调用释放空间。
该方法的好处是,用后释放,不继续占用。
缺点是,代码复杂,必须保存原始分配空间的首地址,并对其释放,否则会出现内存泄露。