快速冪與位運算

2021-02-24 記錄每一天的收穫
以2^n為例,對於普通辦法,即使是long long類型的,求到2^31次方即會溢出。
long long Pow(long long a,long long  b){       int ans = 1;    for(int i=1; i<=b; i++)        ans*=a;    return ans;}

或許有人說可以將

ans*=a改為ans=a*ans%1000;

但是我們來計算一下耗時

#include <iostream>#include <cmath>#include <time.h> using namespace std;
long long Pow(long long a,long long b){ long long ans = 1; for(int i=1; i<=b; i++) ans=a*ans%1000; return ans;}int main() { clock_t start, finish; long long base, power; cin >> base >> power; start = clock(); cout << Pow(base, power) << endl; finish = clock(); cout << "the time cost is " << double(finish - start) / CLOCKS_PER_SEC; return 0;}

雖然可以求出來,但時間非常長,因此引入了更好的算法:快速冪算法
 ( a + b ) % c = ( ( a % c ) + ( b % c ) ) % c ( a * b ) % c = ( ( a % c ) * ( b % c ) ) % c ( a – b ) % c = ( ( a % c ) – ( b % c ) ) % c

以上公式表達為代碼:

long long quickPow(long long a, long long b) {   long long ans=1;   while(b>0)   {     if(b%2==0)     {       b/=2;      a = (a%1000)*(a%1000)%1000;  }else{        b=b-1;     ans=(a%1000)*(ans%1000)%1000;     b/=2;     a = (a%1000)*(a%1000)%1000;  }    }   return ans;}

long long quick(long long a,long long b){  long long ans=1;  while(b>0)  {    if(b%2==1)    {      ans=(a%1000)*(ans%1000)%1000;    }    a = (a%1000)*(a%1000)%1000;      b /= 2;  }  return ans;}

long long quick(long long a,long long b){  long long ans=1;  while(b>0)  {    if(b&1)    {      ans=(a%1000)*(ans%1000)%1000;    }    a = (a%1000)*(a%1000)%1000;    b >>= 2;  }  return ans;}

1、位邏輯運算符:

      & (位      "與")  and
      ^ (位   "異或")
      |   (位      "或")   or
      ~ (位   "取反")
2 、移位運算符:
      <<  (左移)
       >> (右移)

& 運算 :2個都為1才是1

00111 & 00100= 11100

&運算通常用於二進位取位操作。

X &1的結果就是取X二進位的最末位。

最末位為0表示該數是偶數,

最末位為1表示該數為奇數

| 運算:1個為1即為1

00111 |  11111 =11100

X|1的結果就是把X二進位最末位強行變為1

如果需要把二進位最末位變成0,對這個數

X |1之後再減一就可以了,其實際意義就是把X這個數強行變成最近接的偶數

^ 運算 :不同則為1,相同則為0

00111^ 11011=11100

^運算通常用於對二進位的特定一位進行取反操作,^運算的逆運算是它本身,也就是說兩次異或同一個數最後結果不變,即(a^b)^b=a;

~運算:把內存中的0和1全部取反

(~運算 有符號整型和無符號整型的區分

<<運算

a<<b 表示把a轉為二進位後左移b位(在後面添加 b個0)。

例如100的二進位表示為1100100,100左移2位後(後面加2個零):

   1100100<<2 =110010000 =400。

#include<iostream>using namespace std;int main(){  int a=100;  a=a>>2;   cout<<a;  return 0;  }

結果為400

可以看出,a<<b的值實際上就是a乘以2的b次方,因為在二進位數後面添加一個0就相當於該數乘以2,2個零即2的2次方 等於4。

通常認為a<<1比a*2更快,因為前者是更底層一些的操作。因此程序中乘以2的操作儘量用左移一位來代替。

>>運算

和<<相似,a>>b表示二進位右移b位(去掉末b位),相當於a除以2的b次方(取整)。

最大公約數的二進位算法用除以2操作來代替%(mod)運算,效率可以提高很多。

#include <iostream>using namespace std;long long quickPow(long long a,long long b){       long long  ans = 1;    while(b)    {        if(b&1)         {          ans=(a%1000)*(ans%1000)%1000;        }        a = (a%1000)*(a%1000)%1000;        b >>= 2;    }    return ans;}long long  pow(long long  a,long long b){       long long  ans = 1;    for(int i=1; i<=b; i++)        ans *= a;    return ans;}int main() {    cout<<quickPow(2, 20)<<endl;       cout<<pow(2,20)<<endl;        return 0;}

相關焦點

  • 快速冪算法
    (看標題)快速冪:快速冪算法能幫我們算出指數非常大的冪,傳統的求冪算法之所以時間複雜度非常高(為O(指數n)),就是因為當指數n非常大的時候,需要執行的循環操作次數也非常大。所以我們快速冪算法的核心思想就是每一步都把指數分成兩半,而相應的底數做平方運算。這樣不僅能把非常大的指數給不斷變小,所需要執行的循環次數也變小,而最後表示的結果卻一直不會變。
  • 冪的運算小結+測驗(同底數冪的乘法、冪的乘方、積的乘方)
    一、意義什麼是冪的運算?冪的運算包括同底數冪的乘法、冪的乘方和積的乘方。同底數冪的乘法即相同底數的冪相乘,冪的乘方即乘方再乘方,積的乘方即乘積的乘方。要理解這三個概念,首先要明白什麼是乘方和冪。求幾個相同因數的積的運算叫做乘方,乘方的結果叫做冪。乘方是一種運算,強調過程;冪是結果,強調整體。很多時候二者可以通用,比如2^3可以讀作2的3次方,也可以讀作2的3次冪。
  • 初中數學:冪運算(同底數冪乘除、冪的乘方、積的乘方)經典題
    冪的運算是整式的乘法和除法的基礎,同學們計算易出錯,主要就是在冪的運算上出錯多,一是對冪的內涵理解不夠,導致計算方法(公式)混淆;二是思路不明確,無從下手。冪的運算:同底數冪的乘法、冪的乘方、積的乘方。
  • 初中數學一種新的運算方式以及冪的運算法則,保存收藏
    初中數學北師大的教材,在七年級下冊開篇我們會學到一種新的運算方式,也就是冪的運算。冪的運算學習在整個數學學習上都有著舉足輕重的作用,其實估計不少同學有一種感覺,數學是一個拼湊的學科,各個知識點拿到一起就是一個大考點,分散開來就是一個個小知識點,就和積木一樣,多個知識點放到一起會拼成一個讓你驚喜的大玩具,這其實也是數學的一種樂趣和魅力。因此在數學學習上,如果你想拼成一個宏大的完整藍圖,那我們哪個零件都不能丟。
  • 2021年初中八年級代數考點:整數指數冪,分數指數冪的運算
    中考網整理了關於2021年初中八年級代數考點:整數指數冪,分數指數冪的運算,希望對同學們有所幫助,僅供參考。   整數指數冪,分數指數冪的運算   考核要求:   (1)掌握冪的運算法則;   (2)會用整數指數冪及負整數指數冪進行運算;   (3)掌握負整數指數式與分式的互化;   (4)知道分數指數式與根式的互化。
  • 以2的冪的冪的速度增長?量子計算機的運算能力將會有多恐怖?
    也有一些人表示對莫爾定律失效的擔憂,比如日本物理學家加來道雄在2012年稱,計算機性能在10年內可以保持持續生命力,但在2025年之後,由於矽材料技術的限制,要面臨高溫和漏電的難題,將會無法承受指數級增長的運算。莫爾定律一旦失效,什麼計算機才能更高速的處理人類愈加複雜的運算要求?量子計算機來了,它的運算似乎可以用指數的指數級增長來形容,即2的冪的冪的速度,這將是人類處理信息顛覆性的手段。
  • 2021中考數學一輪複習——第6講:冪的運算
    冪的運算我們今天要複習的是「冪的運算」,冪就是楊冪的冪。2、冪的運算【同底數冪的乘法】我們剛說了,如果兩個冪的底數是一樣的,這兩個冪稱為同底數冪,下面先講同底數冪的乘法。大概就是這個意思:同底數冪的運算屬於中考的必考內容。比較簡單,重點要準確記憶基本公式!【積的乘方】(積的冪)所謂積的乘方,就是兩個數或代數式的乘積的冪(乘方)這個在中考也是中高頻考點。
  • [洛穀日報第79期]二進位與位運算
    一道例題(2017tg初賽)先確定該數是負數,然後還原操作得到 01010101=85 ,結果為 -85--介紹幾種簡單的位運算因為計算機使用的是二進位,自然就有獨成一套體系的運算方式,即位運算。位運算是計算機中最簡潔的運算,並且具有很好用的性質,而且用起來還比較快。總而言之,位運算是十分實用的。
  • 教學研討|指數與指數冪的運算(2課時)·教案·課件
    研討素材一第一課時教學目標:1.知識與技能:(1)理解分數指數冪和根式的概念;(2)掌握分數指數冪和根式之間的互化;(3)掌握分數指數冪的運算性質;(4)培養學生觀察分析、抽象等的能力.2.過程與方法:通過與初中所學的知識進行類比,分數指數冪的概念,進而學習指數冪的性質.3.情態與價值(1)培養學生觀察分析,抽象的能力,滲透「轉化」的數學思想;(2)通過運算訓練,養成學生嚴謹治學,一絲不苟的學習習慣;(3)讓學生體驗數學的簡潔美和統一美.
  • 基本初等函數1 - 指數函數 - 指數與指數冪的運算
    2.1.1 指數與指數冪的運算為可更好地學好本節的內容,先複習初中關於乘方的相關知識。(1)知識回顧:【1】乘方:求n個相同因數(a)乘積的運算叫乘方,即 a×a×a×……×a(共n個a相乘),記做:a^n(沒法列印用此代替,按課本寫法)。
  • 2018初中數學公式之冪的運算性質
    下面是《2018初中數學公式之冪的運算性質》,僅供參考!   冪的運算性質:① 同底數冪相乘:a^m·a^n=a^(m+n)     ② 冪的乘方:(a^m)n=a^mn     ③ 積的乘方:(ab)^m=a^m·b^m     ④ 同底數冪相除:a^m÷a^n=a^(m-n) (a≠0)     這些公式也可以這樣用:⑤a^(
  • 七年級下冊數學:冪的運算之同底數冪的乘法解析(附基礎練習)
    冪的概念:求n個數a的積的運算叫乘方,即aaa…a=a^n(n個a相乘),其中a求底數,n叫指數,a^n(乘方的結果)叫冪。+n)同底數冪相乘,底數不變,指數相加。現在我們就利用同底數冪相乘的運算法則來進行相關計算。例1、計算:分析:在同底數冪的運算中,底數可以用任意的數或代數式來代替,自然「負數的奇數次冪是負數,負數的偶數次冪是正數"要記牢。
  • 必看系列3——指數與指數函數,指數冪的運算、指數函數的性質
    想要了解指數函數,我們就必須先要了解指數與指數冪的運算。一、指數與指數冪的運算在初中時,我們已經學習正數的平方根,也簡單介紹了立方根。但並沒有深入介紹,所以在這裡就詳細地給大家介紹以下幾點。②根式(人教版教材截圖)③整數指數冪的運算法則
  • 初中數學,同底數冪乘法和除法運算重要基礎題型匯總
    初中數學,同底數冪乘法和除法運算重要基礎題型匯總。考查內容:1、同底數冪乘法和除法公式的使用方法;2、底互為相反數的冪如何化為同底。01、化同底的基礎:冪的指數為奇數時,底變成相反數時,冪的前面要添加一個負號;冪的指數為偶數時,底變成相反數時,冪的值不變,即冪的前面不能添加負號,如果是填空,前面添加加號即可。02、同底數冪乘法的基礎運算:底數不變,指數相加即可,需要注意的是,單個字母的指數為1,不是0。
  • 實數指數冪及其運算法則ppt-中職數學基礎模塊上冊課件
    中職數學基礎模塊上冊《實數指數冪及其運算法則》ppt1.準確理解實數指數冪的概念,熟練掌握實數指數冪運算法則的應用;2.自主學習,合作學習,探究實數指數冪運算的規律和方法;3.激情投入,高效學習,體驗學習的快樂。
  • 別覺得冪的運算很簡單,這幾道題你也不見得玩得轉
    有同學問了,難道冪的運算這是知識點是它造出來的,並非如此。而是冪這個字運用到數學上就來源於徐光啟的發明創造。上文說了,徐光啟為中西方文化交流做出了重要貢獻,其中一點就是把西方一些經典的數學著作由原來的語言文字翻譯成漢字來表達。從這方面來說,徐光啟同志的外語也肯定不是一般的麻溜,要是看不懂外文想做翻譯事業除非是瞎編亂造了。
  • 高中數學必修一知識點:指數與指數冪的運算
    高中數學必修一知識點:指數與指數冪的運算 2017-05-04 09:34 來源:新東方網編輯整理 作者:
  • 2019初中數學常用公式之冪的運算性質
    下面是《2019初中數學常用公式之冪的運算性質》,僅供參考!
  • 快速區分指數函數與冪函數
    通過本文您可以快速區分指數函數與冪函數,同時了解「冪函數」叫法的由來。 y=x^a與y=a^x哪一個是指數函數,哪一個是冪函數?一句話就可以區分:自變量在指數部分的為指數函數,底為自變量的是冪函數。我們常說某種物體呈指數式增長,就是指它的增長曲線為指數函數,表示增長迅速!
  • 指數,對數,冪比較大小
    有位叫gxing的讀者很認真的指出有道題錯了,很感激,我們會更認真地進行公眾號的更新,還希望大家一如既往有錯必糾,更希望志同道合者投稿。