每天一道高頻題:pow(x,n)

2021-02-21 Java記錄
說明:-100.0<x<100.0,n是32位有符號整數,其數值範圍是[-2^31,2^31-1]最簡單的做法:將n個x進行相乘,時間複雜度:O(n),空間複雜度:O(1)

1public class Pow {
2    public double myPow(double x, int n) {
3        double res = 1;
4        while (n > 0) {
5            res *= x;
6            n--;
7        }
8        return res;
9    }
10}

快速冪(分治):時間複雜度:O(logn),非遞歸空間複雜度:O(1),遞歸空間複雜度:O(logn)

1public class Pow {
2    public double myPow(double x, int n) {
3        if (n == 0) return 1;
4        if (n == -1) return 1 / x;
5        double half = myPow(x, n >> 1);
6        half *= half;
7        // 是否為奇數
8        return ((n & 1) == 1) ? (half * x) : half;
9    }
10}

1public class Pow {
2    public static double myPow(double x, int n) {
3        long y = (n < 0) ? -((long) n) : n;
4        double res = 1.0;
5        while (y > 0) {
6            if ((y & 1) == 1) {
7                // 如果最後一個二進位位是1,就累乘上x
8                res *= x;
9            }
10            x *= x;
11            // 捨棄掉最後一個二進位位
12            y >>= 1;
13        }
14        return (n < 0) ? (1 / res) : res;
15    }
16}

請設計一個算法求x的y次冪模z的結果:x^y%z,假設x,y都可能是很大的整數,x>=0,y>=0,z!=0公式:(a*b)%p=((a%p)*(b%p))%p2^100 % 6 = (2^50 * 2^50) % 6 = ((2^50 % 6) * (2^50 % 6)) % 62^101 % 6 = (2^50 * 2^50 * 2) % 6 = ((2^50 % 6) * (2^50 % 6) * (2 % 6)) % 6

1public class Pow {
2    public static int powMod(int x, int y, int z) {
3        if (y < 0 || z == 0) return 0;
4        if (y == 0) return 1 % z;
5        int half = powMod(x, y >> 1, z);
6        half *= half;
7        if ((y & 1) == 0) { // 偶數
8            return half % z;
9        } else { // 奇數
10            return (half * (x % z)) % z;
11        }
12    }
13}

1public class Pow {
2    public static int powMod(int x, int y, int z) {
3        if (y < 0 || z == 0) return 0;
4        int res = 1 % z;
5        x %= z;
6        while (y > 0) {
7            if ((y & 1) == 1) {
8                // 如果最後一個二進位位是1,就累乘上x
9                res = (res * x) % z;
10            }
11            x = (x * x) % z;
12            // 捨棄掉最後一個二進位位
13            y >>= 1;
14        }
15        return res;
16    }
17}

相關焦點

  • LeetCode-50.求X的N次方(Pow(x, n))
    Pow(x, n)實現 pow(x, n) ,即計算 x 的 n 次冪函數。def myPow(self, x: float, n: int) -> float: if x == 0: return 0 if n < 0: n = -n x = 1 / x res = 1 for i in range(n):
  • 如何求形如∫dx/(√x+n√x)的不定積分
    本文主要內容:積分函數的分母為x的二次根式和x的n次根式的和,主要方法是換元法,通式計算及舉例如下。1.當n為奇數時的不定積分通式1.1舉例當n=3時的不定積分1.2舉例當n=5時的不定積分可見,n為奇數時,函數可積,且n越大,不定積分結果中函數類型越多越複雜。
  • x的n次方-1的因式分解及應用
    今天小編介紹的是x的n次方-1的通用分解因式和他的證明,以及公式在等比數列前n項和and某個高等數學等價無窮小的證明中的使用。先上公式那麼這個公式有什麼用呢?1,求等比數列的前N項和雖然在初等數學教科書中用了倍差法推出了前n項和公式,但是我們也可以用上面的公式求。
  • 從一道高考數列題探討數列前n項和求法
    關注默契小甜瓜,每天分享不一樣的小知識在文章 有時間就看一道高考數列題吧中,我們通過一道高考數學模擬題討論了數列通項公式的一般求解方法,昨天晚上,這道題也是已知數列 {a} 的前n 項和 S 和通項公式 a 的關係。
  • 一道期中壓軸題的思考
    看一道期中測試題:這道題滿分12分,均分不到3分,可謂是「失效題」,絕大多數學生都是靠第一問拿分,第二問能做對的同學鳳毛麟角
  • 每天一道leetcode234-回文鍊表
    輸出: false示例 2:輸入: 1->2->2->1輸出: true題目詳解 距離AC只差一個測試用例的錯誤思路之前應該有看過關於回文鍊表的一種解法,就是對於鍊表的每個元素依次乘以1,2,3,4…求得一個和sum1;然後就是把這個鍊表反轉,反轉鍊表正好昨天做過哈,每天一道
  • Go 刷 leetcode|一道簡單難度卻讓我陷入沉思的題目
    今天為大家講解 LeetCode 第 53 題,繼續為大家帶來一道常考的數組題目
  • 原創y=ln x與y=eˣ切線通式
    根據以往經驗,一張數學試題會有可能在10--12題的位置出現一道有關基礎函數切線的問題,比如此題思路也比較明了,就是通過左右變換和換元
  • 已知x^2-y^2=xy,求(x+y)/(x-y)的
    主要內容:介紹通過正比例換元、中值換元、三角換元以及二次方程求根公式等方法,計算代數式(x+y)/(x-y)在x^2-y^2=xy條件下具體值的步驟。思路一:正比例替換設y=kx,代入已知條件得:x^2-(kx)^2=x*kx,(1-k^2)x^2=kx^2,1-k^2=k,則:k^2+k-1=0,由求根根式得:k=(-1±√5)/2;代數式=(x+kx)/(x-kx)=(1+k)/(1-k)=2±√5。