OJ基础
输出技巧
要输出一个char数组时
char str[n];
...
...
//一系列处理后
str[n]='\0';
printf("%s",str); //在数组末尾加上\0可以直接输出,省时
赋初值技巧
bool visited[n];
memset(visited, 0, sizeof(visited));
//memset用于赋初值,多用于字符串
大根堆小根堆
priority_queue<int, vector<int>, greater<int> > Q;
//小根堆,注意最后的> >中间空格
priority_queue<int> Q;
//默认为大根堆
//每次top出最大值或最小值
注意事项
在使用到stack,queue的时候,注意进行清空
while(!Q.empty())
{
Q.pop();
}
高精度数
struct bigInteger{
int digit[40];
int size;
void init(){
for(int i=0;i<40;i++)
digit[i]=0;
size=0;
}
void set(int x)
{
init();
size=0;
do{
digit[size++]=x%100000;
x/=100000;
}while(x!=0);
}
bigInteger operator * (int x) const{
bigInteger ret;
ret.set(0);
int tmp=0,i;
for(i=0;i<size;i++)
{
ret.digit[i]=(digit[i]*x+tmp)%100000;
tmp=(digit[i]*x+tmp)/100000;
}
if(tmp!=0)
{
ret.digit[size]=tmp;
ret.size=size+1;
}else
ret.size=size;
return ret;
}
bigInteger operator + (const bigInteger &A) const{
bigInteger ret;
ret.set(0);
int tmp=0,i;
for(i=0;i<size||i<A.size;i++)
{
ret.digit[i]=(digit[i]+A.digit[i]+tmp)%100000;
tmp=(digit[i]+A.digit[i]+tmp)/100000;
}
if(tmp!=0)
{
ret.digit[i]=tmp;
ret.size=i+1;
}else
ret.size=i;
return ret;
}
bool operator > (const bigInteger &A) const{
if(size>A.size) return true;
else if(size<A.size) return false;
else{
int i=size-1;
while(i&&digit[i]==A.digit[i]) i--;
return digit[i]>A.digit[i];
}
}
void ouput()
{
printf("%d",digit[0]);
}
};
二分求幂
快速求a的b次方的方法,原理图为:

剑指offer上的递归代码:
double exp_mod(double a, unsigned int b)
{
if(b == 0)
return 1;
if(b == 1)
return a;
double result=exp_mod(a, b>>1);
result*=result;
if(b & 1) //若b为奇数
result *= a;
return result;
}
机试指南上的非递归代码:
int power(int a, int b)
{
int ans=1;
while(b!=0)
{
if(b & 1)
ans *= a;
b>>=1;
a*=a;
}
return ans;
}

浙公网安备 33010602011771号