1. 程式人生 > >快速冪(原理,一般,遞迴,位運算演算法)

快速冪(原理,一般,遞迴,位運算演算法)

  因為一開始對位運算不是很明白,加上2進位制權值忽然一說像聽了一個新詞,第一次碰見放下了,第二次也,,第三次也,今天就好好把它給看明白。

概念:快速計算底數的n次冪。

例題:(想明白就自己拿出筆紙耐心看下去,自己寫出來的才有自信說看明白了)

   求a的b次方

   1,把b轉換成二進位制數

         假設b=11,則b=11的二進位制是1011,則根據 二進位制數第i位的權為 , 

         即得:11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,

         即得

    2,因此,我們將a¹¹轉化為算 

 一些位運算的知識:

b & 1//取b二進位制的最低位,判斷和1是否相同,相同返回1,否則返回0,可用於判斷奇偶

b>>1//把b的二進位制右移一位,即去掉其二進位制位的最低位

程式碼各種實現:

常規求冪

int pow1(int a,int b){
   int r=1;
   while(b--) r*=a;
   return r;
} 

快速求冪(一般)

int pow2(int a,int b){
    int r=1,base=a;
    while(b!=0){
    if(b%2) r*=base;
    base*=base;
    b/=2;
    }
    return r;
}

快速求冪 (遞迴)

int f(int m,int n){   //m^n
    if(n==1) return m;
    int temp=f(m,n/2);
    return (n%2==0 ? 1 : m)*temp*temp;
}

快速求冪(位運算)

int pow3(int x,int n){
  if(n==0) return 1;
  else {
    while((n&1)==0){
      n>>=1;
      x*=x;
    }
  }
  int result=x;
  n>>=1;
  while(n!=0){
    x*=x;
    if(n&1) result*=x;
    n>>=1;
  }
  return result;
}

快速求冪(位運算,更簡潔)

int pow4(int a,int b){
  int r=1,base=a;
  while(b){
    if(b&1) r*=base;
    base*=base;
    b>>=1;
  }
  return r;
}

  快速冪不僅僅有這個,還有快速冪取模,矩陣快速冪,吧啦吧啦,,今天先入門,以後學到了再來新增。

相關推薦

快速原理一般運算演算法

  因為一開始對位運算不是很明白,加上2進位制權值忽然一說像聽了一個新詞,第一次碰見放下了,第二次也,,第三次也,今天就好好把它給看明白。 概念:快速計算底數的n次冪。 例題:(想明白就自己拿出筆紙耐心看下去,自己寫出來的才有自信說看明白了)    求a的b次方;

爬蟲實戰整站爬蟲新浪新聞並按照路徑儲存在本地

新浪網分類資訊爬蟲 爬取新浪網導航頁所有下所有大類、小類、小類裡的子連結,以及子連結頁面的新聞內容。 效果演示圖: items.py import scrapy import sys reload(sys) sys.setdefaultencoding("utf-8"

【LeetCode-面試演算法經典-Java實現】【145-Binary Tree Postorder Traversal二叉樹非後序遍歷

原題   Given a binary tree, return the postorder traversal of its nodes’ values.   For exampl

【leetcode】145Binary Tree Postorder Traversal二叉樹非後序遍歷

二叉樹後序遍歷非遞迴方法很多書和部落格已經講的很清楚啦,這裡就是記錄一下方便自己日後看 基本思路是: 利用棧來實現 先找到最左節點,過程中的節點都入棧 如果該節點沒有右孩子或前一步訪問了右孩子(根據後序遍歷二叉樹的特點可以知道,如果當前節點有右孩子,則訪問當前節點前一定是

斐波那契數列陣列普通記憶化搜尋矩陣快速和公式法

直接數列遞推推的時候是O(n)的複雜度,查詢的時候是O(1),但是當n很大的時候,陣列空間可能有點力不從心 #include <iostream> #include <cstdio> using namespace std; int fb[4

矩陣快速模板

題目來源:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1137 【題意】 中文題意不在敘述,只是讓求一個矩陣的乘法而

快速排序C++實現

#include <iostream> #include <vector> #include <stack> using namespace std; int q

分享一小坑以後碰到了可以快速規避swagger 對 名稱為 nodeName 的參數報錯

order error: ror 前臺 屬性 ase solid 1-57 erro ---------------------------------------------------------------------------------踩坑過程:①webapi的

快速取模(當數很大時相乘long long也會超出的解決辦法)

結合 超出 但是 long 數字 也會 連續 return result 當幾個數連續乘最後取模時,可以將每個數字先取模,最後再取模,即%對於*具有結合律。但是如果當用來取模的數本身就很大,采取上述方法就不行了。這個時候可以借鑒快速冪取模的方法,來達到大數相乘取模的效果。

【qduoj - 夏季學期創新題】矩形剖分dp

題幹: 描述   對一個給定的矩形,將其劃分成儘可能少的正方形,輸出正方形的最少個數。例如,如下圖所示的情況,則輸入為3和4,輸出為4。 輸入   輸入兩個整數中間用空格分開。 輸出   輸出最少分割成的正方形的個數。 輸入樣

矩陣快速共軛函式兩種推式

題目連結:https://cn.vjudge.net/contest/261339#problem/B AC1:ans= x(n)+y(n)*sqrt(6),所以,ans=x(n)+y(n)*sqrt(6)+(x(n)-y(n)*sqrt(6))-(x(n)-y(n)*sqrt(6))=2*

java斐波那契數列Fibonacci sequence的三種方式:備忘錄動態規劃

java斐波那契數列(Fibonacci sequence)的三種方式:遞迴,備忘錄,動態規劃 1.最常使用的是遞迴,就是從上往下尋找答案,然後在返回來。 2.備忘錄也是從上往下,只是去掉了遞迴中重複計算的部分,因為它使用一個容器來裝已經計算出的值,這裡就多一個判斷,如果計算過該式子,就直接

圖的深度優先遍歷+詳解

圖的深度優先遍歷 非遞迴演算法: #include<iostream> #include<stack> using namespace std; const int MaxSize=100; class MGraph{//鄰接矩陣的構建 p

【CodeForces - 266C】Below the Diagonal 子問題貪心模擬

題幹: You are given a square matrix consisting of n rows and n columns. We assume that the rows are numbered from 1 to

快速 二進位制這個好像一般不會爆掉!!

int poww(int a, int b) {   int ans = 1, base = a;     while (b != 0) {       //如果b的所有位都被踢掉 也就是b不存在了 那麼就沒有指數了 就算不出下去了 也

LeetCode刷題Easy篇斐波那契數列問題,尾和動態規劃解法

題目 斐波那契數列:  f(n)=f(n-1)+f(n-2)(n>2) f(0)=1;f(1)=1;  即有名的兔子繁衍問題  1 1 2 3 5 8 13 21 .... 我的解法 遞迴 public static int Recursion

vue專案搭建由於是初學者路由及檔案的放置有些不規範一般子元件建議放於components下

1.目錄簡介: 2.設定路由: 1)修改router/index.js檔案 引入元件: import Index from '@/index' import Login from '@/login' 設定路由: routes: [{         path:

圖的深度優先遍歷鄰接矩陣

參考部落格:圖的深度優先遍歷(遞迴、非遞迴;鄰接表,鄰接矩陣) 本篇預設連通圖,非連通情況會在鄰接表處補上   1.鄰接矩陣的遞迴解法 #include<stdio.h> #define MAX 100 typedef struct { int e[MAX][MA

圖的深度優先遍歷鄰接表

參考部落格:圖的深度優先遍歷(遞迴、非遞迴;鄰接表,鄰接矩陣) 本程式碼有個問題:就是結點是對應儲存下標的,要解決這個問題,可以增加一個定位函式(LocateVec),不修改也可以使程式碼簡潔些 關於非連通圖的bug已修改,就是增加了dfsTraverse函式迴圈遍歷一遍結點:沒訪問過則再做一次dfs

js實現優化防止棧溢位

一、一版的遞迴實現 n!,比如 5!= 5 * 4 * 3 * 2 *1       function fact(n) {             if(n == 1) {