一、快速幂
计算一个常数的n次幂,如果直接暴力相乘的话有可能会超时,因此使用递归连续计算常数的平方可以减少复杂度
int fastpow(int a,int n)
{ if(n==1) return a;
int t=fastpow(a,n/2); 缩小向下递归计算
if(n%2==1) return t*t*a; 如果是奇数递归时会被多消掉一个a,要补上
else return t*t;
二、最大公约数和最小公倍数
后来才知道有模板,几个月前做了个综合题型,想了好几种方法都超时了…
用辗转相除法可以减小复杂度
int gcd(int a,int b)
{ return b==0?a:gcd(b,a%b);}
int lcm(int a,int b)
{ return a/gcd(a,b)*b;}
三、素数
首先是判断素数问题,一个数n不被[2,n-1]内的所有数整除就是素数,但是如果把这范围内的数全都试一遍很容易超时,实际上只需要证明[2,sqrt(n)]范围即可
bool prime(int n)
{ if(n<=1) return false;
for(int i=2;i*i<=n;i++)
{ if(n%i==0) return false;}
return true;}
判断素数个数问题,用埃及筛法可以更快的求解,从素数2开始从小到大依次排除2的倍数,之后是3…
int sushu(int n)
{ for(int i=0;i<=n;i++){ v[i]=false;}
for(int i=2;i*i<=n;i++)
{ if(!v[i])
for(int j=i*i;j<=n;j+=i)
{ v[j]=true;}}
int k=0;
for(int i=2;i<=n;i++)
{ if(!v[i]) p[k++]=i;}
return k;
}