Lintcode: Fast Power 解题报告

Fast Power

原题链接:http://lintcode.com/en/problem/fast-power/#

Calculate the an % b where a, b and n are all 32bit integers.

Example

For 231 % 3 = 2

For 1001000 % 1000 = 0

Challenge

O(logn)

Tags Expand

Lintcode: Fast Power 解题报告

SOLUTION 1:

实际上这题应该是suppose n > 0的。

我们利用 取模运算的乘法法则: http://baike.baidu.com/view/4887065.htm

(a * b) % p = (a % p * b % p) % p (3)

将 a^n % b 分解为 (a^(n/2) * a^(n/2) * (a)) %b = ((a^(n/2) * a^(n/2))%b * (a)%b) %b = ((a^(n/2)%b * a^(n/2)%b)%b * (a)%b) %b

实现如下:

注意2个base case: n = 0 n = 1都要特别处理。因为n = 1时,会分解出一个pow(a, b, 1),这个会不断循环调用。

 1 class Solution {

 2     /*

 3      * @param a, b, n: 32bit integers

 4      * @return: An integer

 5      */

 6     /*

 7      * @param a, b, n: 32bit integers

 8      * @return: An integer

 9      */

10     public static int fastPower(int a, int b, int n) {

11         // write your code here

12         long ret = pow(a, b, n);

13         

14         return (int) ret;

15     }

16     

17     // suppose n > 0

18     public static long pow(int a, int b, int n) {

19         if (a == 0) {

20             return 0;

21         }

22         

23         // The base case.

24         if (n == 0) {

25             return 1 % b;

26         }

27         

28         if (n == 1) {

29             return a % b;

30         }

31         

32         long ret = 0;

33         

34         // (a * b) % p = (a % p * b % p) % p (3)

35         ret = pow(a, b, n / 2);

36         ret *= ret;

37         

38         // 这一步是为了防止溢出

39         ret %= b;

40         

41         if (n % 2 == 1) {

42             ret *= pow(a, b, 1);

43         }

44         

45         // 执行取余操作

46         ret = ret % b;

47         

48         return ret;

49     }

50 };
View Code

SOLUTION 2:

或者你也可以把pow(a, b, 1)直接写为a % b. 以下解法把base case: n = 1就拿掉了。

 1 // SOLUTION 2:

 2     // suppose n > 0

 3     public static long pow(int a, int b, int n) {

 4         if (a == 0) {

 5             return 0;

 6         }

 7         

 8         // The base case.

 9         if (n == 0) {

10             return 1 % b;

11         }

12         

13         long ret = 0;

14         

15         // (a * b) % p = (a % p * b % p) % p (3)

16         ret = pow(a, b, n / 2);

17         ret *= ret;

18         

19         // 这一步是为了防止溢出

20         ret %= b;

21         

22         if (n % 2 == 1) {

23             ret *= (a % b);

24         }

25         

26         // 执行取余操作

27         ret = ret % b;

28         

29         return ret;

30     }
View Code

 

GITHUB:

https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/lintcode/math/FastPower.java

你可能感兴趣的:(code)