• pat每日刷题计划--day71


    快速幂(所有可能溢出的地方都要mod)

    递归写法

    几点注意事项:1、temp在里面要先算出来一半再temp*temp,不然两次进循环复杂度增加

                             2、%m不要忘了写

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    int binaryPow(int a,int b,int m)
    {
        int temp;
        if(a==0) return 0;
        if(m==1) return 0;
        if(b==0) return 1;
        if(b==1) return a%m;
        a=a%m;
        if(b&1)
        {
            return a*binaryPow(a,b-1,m)%m;
        }
        else
            temp=binaryPow(a,b/2,m)%m;
            return temp*temp%m;
    }
    int main()
    {
        int a,b,m;
        scanf("%d%d%d",&a,&b,&m);
        printf("%d^%d mod %d=%d",a,b,m,binaryPow(a,b,m));
        return 0;
    }
    View Code

    迭代写法

    注意a*a的位置也要modm 不然可能会溢出导致结果错误。

    迭代中 eg:b=10  对应的二进制1001 这时候就是a^8*a^2

    里面的a一直随着b走向高位每次都是a*a(注意是a*a不是a平方,因为二进制位数符号是16 8 4 2 这种的)

    还有就是第一次是要先动ans再动a*a,否则会错位

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    int binaryPow(int a,int b,int m)
    {
        if(m==1) return 0;
        int ans=1;
        a=a%m;
        while(b>0)
        {
    
            if(b%2==1)
            {
                ans=ans*a%m;
            }
            a=a*a%m;
            b=b/2;
        }
        return ans;
    }
    int main()
    {
        int a,b,m;
        scanf("%d%d%d",&a,&b,&m);
        printf("%d^%d mod %d=%d",a,b,m,binaryPow(a,b,m));
        return 0;
    }
    View Code

     实际操作差别不大,我觉得递归更方便一点

    int的范围是-2^31~2^31-1

    时间才能证明一切,选好了就尽力去做吧!
  • 相关阅读:
    《新人口论》摘录
    中国历史上农村剩余劳动力的安置政策
    sql 善后处理的一些代码
    淘宝骗家实录
    什么决定着我们的工作
    【原创】打造具有EnableWindow功能的SPYXX
    文件被锁住删除不了的一种解决方法
    去除页面中所有的标记
    用动网论坛做BUG管理,感觉还不错
    同事刚告诉我一不错的东东VNN
  • 原文地址:https://www.cnblogs.com/tingxilin/p/12244307.html
Copyright © 2020-2023  润新知