1. 程式人生 > >整數快速冪

整數快速冪

在計算機中如何快速計算整數的N次冪(N為正整數)

我們最先想到的是使用for迴圈去一個一個相乘

x^{n}=x*x*x*...x   (有n個x)

這個是最基本的想法

 

 

還有另一個想法就是使用相同底數相乘  冪相加的原理

x^{19}=x^{16}*x^{2}*x^{1}=x^{16+2+1 }

而且19的二進位制正好為10011            而16的二進位制為10000    同理  2    10   ,1   為1      

利用這個規律我們可以寫出這樣的程式

int QuickPow(int int N)
{
    int ans=1;
    int res=x;
    while(N)
    {
        if(N&1) //判斷是否為奇數效果比m%2==1好    這裡使用的是與操作符
            {
                ans=ans*res;
            }
            res=res*res;      //這裡相當於是(x^i)^2   
        N=N>>1;
    }
    return ans;
}

N>>1   N左移一位相當於除以2

對於X^19來說:
19的二進位制為:1 0 0 1 1
初始:

ans = 1; res = x;

則10011最後一位是1,所以是奇數。

 ans = res*ans = x; 
res = res*res = x^2;

然後右移一位,1 0 0 1
則1001最後一位是1,所以是奇數

    ans = res*ans = x*(x^2) = x^3     
res = res*res = x^2*x^2 = x^4

然後右移一位,1 0 0
則最後一位是0,所以當前的數為偶數。

    res = res*res = x^4*x^4 = x^8

然後右移一位,1 0
最後一位是0,當前數是偶數。

    res = res*res =x^8*x^8= x^16

然後右移一位,1
最後一位是1,當前數是奇數

    ans = ans*res = (x^3)*(x^16) = x^19
    res = res*res = x^32

可以看出res = X^m,m 始終是與二進位制位置上的權值是相對應的。當二進位制位為0時,我們只讓resres使冪指數2.對應下一個二進位制位的權值,當二進位制位為1時,ans = ans*res 。則乘上了該乘的X冪次。

res的作用是計算x的下一個指數冪為多少