• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
neverlandly
博客园    首页    新随笔    联系   管理    订阅  订阅

Lintcode: Fast Power

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

Example
For 2^31 % 3 = 2

For 100^1000 % 1000 = 0

Challenge
O(logn)

这道题跟Pow这道题很像

数学问题,要求O(log n)的时间复杂度,也就是每次去掉一半的计算量,先要找到对应的数学公式:
(a * b) % p = (a % p * b % p) % p

所以(a^n)%b = (a^n/2 * a^n/2 * a) % b = ((a^n/2 * a^n/2)%b * a%b) % b
注意int和long的转化,防止溢出。

比较严谨的做法:

 1 class Solution {
 2     /*
 3      * @param a, b, n: 32bit integers
 4      * @return: An integer
 5      */
 6     public int fastPower(int a, int b, int n) {
 7         // write your code here
 8         long ret = getPower(a, b, n);
 9         return (int)ret;
10     }
11     public long getPower(int a, int b, int n){
12         if(a == 0) return 0;
13         if(n == 0) return 1 % b;
14         if(n == 1) return a % b;
15          
16         long ret = getPower(a, b, n/2);
17         ret *= ret;
18         ret %= b;
19         if(n % 2 == 1){
20             ret = ret * (a % b);
21         }
22         return ret % b;
23     }
24 };

我当时的做法:

 1 class Solution {
 2     public int fastPower(int a, int b, int n) {
 3         if (n == 0) return 1%b;
 4         long half = fastPower(a, b, n/2);
 5         if (n % 2 == 0) {
 6             long temp = half * half;
 7             return (int)(temp % b);
 8         }
 9         else {
10             long temp = (half * half)%b * (a%b);
11             return (int)(temp % b);
12         }
13     }
14 };
 1 class Solution {
 2     /*
 3      * @param a, b, n: 32bit integers
 4      * @return: An integer
 5      */
 6     public int fastPower(int a, int b, int n) {
 7         long ret = helper(a, b, n);
 8         return (int)ret;
 9     }
10     
11     public long helper(int a, int b, int n) {
12         if (n == 0) return 1%b;
13         long half = helper(a, b, n/2);
14         if (n % 2 == 0) {
15             return half * half % b;
16         }
17         else {
18             return ((half * half % b) * a%b)%b;
19         }
20     }
21 };

 

posted @ 2015-02-06 12:10  neverlandly  阅读(947)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3