日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快速幂讲解

發布時間:2025/3/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速幂讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

快速冪的目的就是做到快速求冪,假設我們要求a^b,按照樸素算法就是把a連乘b次,這樣一來時間復雜度是O(b)也即是O(n)級別,快速冪能做到O(logn),快了好多好多。它的原理如下:

  假設我們要求a^b,那么其實b是可以拆成二進制的,該二進制數第i位的權為2^(i-1),例如當b==11時

                     a^11=a^(2^0+2^1+2^3)
  11的二進制是1011,11 = 23×1 + 22×0 + 21×1 + 2o×1,因此,我們將a11轉化為算 a^(2^0)*a^(2^1)*a^(2^3) ,看出來快的多了吧原來算11次,現在算三次,但是這三項貌似不好求的樣子….不急,下面會有詳細解釋。   
  由于是二進制,很自然地想到用位運算這個強大的工具: & 和 >>   
  &運算通常用于二進制取位操作,例如一個數 & 1 的結果就是取二進制的最末位。還可以判斷奇偶x&1==0為偶,x&1==1為奇。  
  >>運算比較單純,二進制去掉最后一位。
  現在已上邊的式子為例:

int powx(int a,int b) {int ans=i,base=a;while(b!=0){if(b&1)ans*=base;base*=base;b>>=1;}return ans; }

代碼很簡單,但還是要理解。
解釋級就自己當初不懂得:

base*=base;

這個是完全為了達到累乘的效果,例如上題,這個就相當于把a^11變成了a^(2^0),a^(2^1),a^(2^3);
另一種詳細的解釋:
其中要理解base*=base這一步,base*base==base^2,下一步再乘,就是base^2*base^2==base^4,然后同理 base^4*base4=base^8,,,,,see?是不是做到了base–>base^2–>base^4–>base^8–>base^16–>base^32…….指數正是 2^i 啊,再看上 面的例子,a11= a^(2^0)*a^(2^1)*a^(2^3),這三項是不是完美解決了,,嗯,快速冪就是這樣。

總結

以上是生活随笔為你收集整理的快速幂讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。