zoukankan      html  css  js  c++  java
  • 模板||快速幂

    有那么一种算法可以让计算a^b变得更快,那就是快速幂。如果直接暴力计算的话需要计算b次。时间蛮长的。

    题目描述:

      输入a,b.(a,b为整数)计算a^b。

    输入输出格式

    输入格式:

    两个整数a、b。.

    输出格式:

    输出“a^b=s”

    s为运算结果

    前提:你需要了解二进制,十进制。位运算的知识(当然也可以没有,万事皆可模拟。)

    没有位运算的:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<iomanip>
    #include<queue>
    #include<cmath>
    using namespace std;
    char e[10001];
    int cd;
    long long quickpow(long long a,char b[]) {
        long long ans=1,base=a;
        while(cd!=-1) {
            if(int(b[cd])!=0) ans*=base;//最后一位是1的话。
            base*=base;
            cd--;//抹去最后一位。
        }
        return ans;
    }
    void zh(long long a) {
        char zs[10001];
        int sum=0;
        while(a!=0) {
            zs[sum]=a%2;
            a/=2;
            sum++;
        }
        sum--;
        int js=sum;
        cd=sum;//转换为二进制后的最后一个元素的位置。
    //如(10)10=(1010)2最后一个元素的位置为三。
        for(int i=0;i<=sum;++i)
        {
            e[js]=zs[i];
            js--;
        }
    }
    
    int main() {
        long long a,b;
        cin>>a>>b;
        zh(b);//将b转换为二进制。
        cout<<quickpow(a,e);
        return 0;
    }

    代码:

    //省略...... 
    long long quickpow(long long a,long long b)
    {
        long long ans=1,base=a;
        while(b!=0)
        {
            if(b&1!=0) ans*=base;    
            base*=base;
            b>>=1;    //将b的二进制数向右移一位(相当于将b的二进制数的最后一位抹掉。)
        }
        return ans;
    }

    PS:不用位运算的代码当指数为零时需要特判!

    注意:因为是乘方运算所以很有可能会爆long long!

    input:

    2 11

    output:

    2048

    先讲一下(&、>>)位运算.

    &:‘&’叫做按位与。作用:把参与运算的两个数对应的二进制相与,只有对应的二进制均为1时,结果(应该也是二进制的形式)的对应位才为1,否则为0。

    >>:'>>'叫做右移。作用:把“>>”左边的运算数的各二进制位全部右移若干位(“>>”右边的那个数)。

    以此样例讲一下吧。

    (11)10=(1011)2。

    如何将二进制转换为十进制那?

    酱紫,1*2+1*21 (+0*22) +1*23

    ∴211=2(1*2+1*21 (+0*22) +1*23)。

    小学我们学过 an*am=an+m

    ∴211=21*22*28

    快速幂就是这样计算的!

    模拟一下样例:

    ans=1,base=2。

    11的二进制数为1011,不为0 进行循环直到为0。

    1011的最后一位为1,ans*base。

    若不为1,就不进行ans*base。

    base*base,就是由2变成了4(2^2)。

    1011抹去最后一位直到为0.

    就是酱紫。

    //转载来自这里

    我就是我不一样的验货
  • 相关阅读:
    一些常看的网站 工具
    JavaScript 学习
    我的周记15——“5年后,你想成为怎样的人”
    一点分享:从日课到晨记
    跟着高淇学Python——第一到第三章总结
    在新的电脑上的Git本地库 与远程库关联前的一些设置
    搭建环境
    查询XML树
    Linq to XML的基本操作
    LINQ to XML概述
  • 原文地址:https://www.cnblogs.com/skkyk/p/10872266.html
Copyright © 2011-2022 走看看