快速冪算法(基於C++)

更高效地求解冪函數

  說到冪函數,固然會聯想到cmath頭文件下的函數pow(底數,指數),可是若是本身寫函數呢?

  我想大多數人會跟我同樣這麼寫:

int power(int a,int b)
{
    int ans=1;
    for(int i=1;i<=b;i++)
    {
        ans*=a;
    }
    return ans;
}

  for循環暴力大法,顯然這個方法沒有錯,可是時間複雜度不是很樂觀,而且還存在溢出的問題。當求解問題的數據過多時,就會超時。

  在解決溢出問題上,不少題目會要求必要的時候對運算結果合理地取模,固然取模也是有運算規則的。

  下面就解決x^y%p這個問題,1 < x < 10^9 , 1 < y < 10 ^18, 1 < p < 10 ^9.

  1.有一種遞歸的方法求解:看圖

 

  原理很簡單,至關於分治的思想,先求一半,再平方,能夠下降時間複雜度。

  2.真正的快速冪,迭代思想

 1 long long power(long long x, long long y, long long p) {
 2     long long r = 1, base = x;
 3     while(y) {
 4         if(y % 2) r *= base;
 5         base *= base;
 6         y /= 2;
 7         base %= p;
 8         r %= p;
 9     }
10     return r;
11 }

    快速冪拓展請看這裏----->快速冪講解<------裏面附有斐波那契矩陣快速冪的代碼html

相關文章
相關標籤/搜索