整數快速冪
阿新 • • 發佈:2019-01-09
在計算機中如何快速計算整數的N次冪(N為正整數)
我們最先想到的是使用for迴圈去一個一個相乘
(有n個x)
這個是最基本的想法
還有另一個想法就是使用相同底數相乘 冪相加的原理
=
而且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的下一個指數冪為多少