快速幂总结,最大公约数(递归版本)

刚刚做了有关位运算的题目,又想起前不久看到的快速幂,里面同样有位运算,所以这个时候想总结一下·,先上代码

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。
(来自百度百科)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值