1.cin,cout的输入输出耗时会大于scanf,printf,如果你想使用cin,cout也可以提高效率的话,就在主函数里加上两行代码
ios::sync_with_stdio(false);
cin.tie(0);
2.定义无穷大无穷小:
#include<limits.h>
...
//输入这个头文件后在代码中可以直接使用INT_MAX和INT_MIN,前者为整形里的最大整数,后者为最小整数
#include<float.h>
...
//输入这个头文件后在代码中可以直接使用DBL_MAX和DBL_MIN,前者为double类型所能代表的最大值,后者为double类型所能代表的最小值
3.解决sqrt函数返回值是double类型,但是你想要存下long long类型的问题:
typedef long long ll;
ll sqrt(ll x)
{
ll s=0,l=1,r=10000000000;
while(l<=r)
{
ll mid=l+r>>1;
if(mid*mid<=x)
{
s=mid;
l=mid+1;
}
else
r=mid-1;
}
return s;
}
4.文件重定向技术(部分竞赛题可能需要读取文件,这时候需要用到这个技巧):
freopen("input.txt","r",stdin);
int a,b;
cin>>a>>b;//从文件中读取a,b
cout<<a+b;
fclose(stdin);//可不写
5.a&1:是一个判断条件,当a为奇数时返回true,反之返回false。其实质是判断a的二进制数最后一位是否为1,如果为1(说明a为奇数),那么a&1==1,反之如果最后一位为0(说明a为偶数),a&1==0
6.n>>1:二进制右移,用于去掉最后一位
比如n=3,3的二进制表示为11,那么n>>1就是把最后一位去掉,所以n>>1=1
再比如n=5,5的二进制表示为101,那么n>>1=10,注意这是二进制的,它对应的十进制数 是 2,所以n>>1=2
7.c++中如何计算log以2为底的数(c++中没有log2函数,但是有log10函数),所以我们可以把
log2(x)=log10(x)/log10(2)
8.生成随机数和刷新随机数:
#include<ctime>
srand((unsigned)time(NULL));//用于刷新随机数
#include<cstdlib>
rand()%n+1//用于生成[1,n]之间的随机数