AC_快速积&快速幂的计算方法

快速幂算法——可迅速求出a^b。其主要理论依据如下:

        1,当b为偶数时,a^b可以转为a^2的b/2次方。

        2,当b为奇数时,a^b可以转为a^2的b/2次方,再乘以a。

//简单来说就是把b当成2进制形式,然后累加;
// 2*7=2*(1*2^0+1*2^1+1*2^2)=2*1*2^0+2*1*2^1+2*1*2^2;

//快速幂——加法
//简单来说就是把b当成2进制形式,然后累加;
// 7 = 111
// 2*7=2*(1*2^0+1*2^1+1*2^2)=2*1*2^0+2*1*2^1+2*1*2^2;
// = 2*1 + 2*2 + 2*4
// = 2 + 4 +8
// = 6 + 8
// = 14

// 2*(1*2^0) = 2   

// 2*(1*2^1) = 4

// 2 * (1*2^2) = 8

代码:

long long cul_sum(long a, long b)
{
    long ans = 0;
    while (b)
    {
        cout << "-------------" << endl;
        if (b & 1)
        {
            ans = ans + a;//将每一项的值加起来  合并最后的结果
            cout << "ans = " << ans << endl;
        }
        a = a + a; //计算每一项的值
        b >>= 1;
        cout << "a = " << a << endl;
    }
    return ans;
}

int main()
{
    long a, b;
    cin >> a >> b;
    cout<<cul_sum(a, b) << endl;
    return 0;
}

计算结果如下:

 快速幂——乘方

//快速幂——乘方
//简单来说就是把b当成2进制形式,然后累乘;
// 7 = 111
// 2*7=2^(1*2^0+1*2^1+1*2^2)=2^(1*2^0) * 2^(1*2^1) * 2^(1*2^2);
// = 2^1 * 2^2 * 2^4
// = 2 * 4 * 16
// = 8 * 16
// = 128
#include<iostream>
using namespace std; 
long long cul_multi(long a, long b)
{
    long ans = 1;

    while (b)
    {
        cout << "-------------" << endl;
        if (b & 1)
        {
            ans = ans * a;
            cout << "ans = " << ans << endl;
        }
        a = a * a;
        cout << "a = " << a << endl;
        b >>= 1;
    }
    return ans;
}
int main()
{
    long a, b;
    cin >> a >> b;
    cout<<cul_multi(a, b) << endl;
    return 0;
}

 

 

posted @ 2019-07-09 10:43  A-inspire  Views(488)  Comments(0Edit  收藏  举报