刚刚做了有关位运算的题目,又想起前不久看到的快速幂,里面同样有位运算,所以这个时候想总结一下·,先上代码
long long quick_pow(long long x,long long p,long long mod)
{
long long ret=1;
while(p)
{
if(p&1)
ret=ret*x%mod;
p>>=1;
x=x*x%md;
}
return ret;
}
刚才听学长的一番解释,顿时恍然大悟,对快速幂的理解深刻了不少,以后不用被着快速幂代码跑了,自己就会写了。
说到这里,又想起来求最大公约数的递归版本,本来也是背着代码跑的,但是后来我记住它了,就 不怎么背着代码跑了但是还是不怎么会,上打码
int gcd(int a,int b)
{
return b==0?a:return (b,a%b);
}
其实平心而论,这个感觉还是碾转相除法,本来高中的时候这个学的就不怎么好,下面上一段百度百科
证明:
设两数为a、b(b<a),求它们最大公约数(a、b)的步骤如下:用b除a,得a=bq......r 1(0≤r)。若r1=0,则(a,b)=b;若r1≠0,则再用r1除b,得b=r1q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止。其最后一个非零余数即为(a,b)。
[编辑] 算法
辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:
1. 若 r 是 a ÷ b 的余数, 则
gcd(a,b) = gcd(b,r)
2. a 和其倍数之最大公因子为 a。
(来自百度百科)