首页 > 编程语言 > 详细

面试题16:数值的整数次方(C++)

时间:2020-04-22 09:13:32      阅读:66      评论:0      收藏:0      [点我收藏+]

题目地址:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/

题目描述

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

题目示例

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25

说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

解题思路

分析题目,求一个整数X的n次方,即Xn利用乘幂原则可以将n拆分:

  • 当n为偶数时,Xn= Xn/2* Xn/2
  • 当n为奇数时,Xn= X(n-1)/2* X(n-1)/2* X

利用递归或者迭代的方法均可解决,需要注意的是,虽然题目中告诉我们不需要考虑大数问题,但是给出的n可以取到-2147483648−2147483648(整型负数的最小值),因此,需要将n转换成long类型,否则,当new_n = -new_n时会产生因越界而赋值出错。当n<0时,我们将其转化为n>0时的处理,即x=1/x;new_n=-new_n;

程序源码

递归

class Solution {
public:
    double myPow(double x, int n) {
        long new_n = n;
        if(new_n < 0)
        {
            return 1 / defPow(x, -new_n);
        }
        return defPow(x, new_n);
    }
    double defPow(double x, long n)
    {
        if(n == 0) return 1;
        if(x == 1) return 1;
        if(n % 2 == 0) //指数是偶数时
        {
            double square = myPow(x, n / 2);
            return square * square;
        }
        else //指数是奇数时
        {
            double square = myPow(x, (n - 1) / 2);
            return square * square * x;
        }
    }
};

迭代

class Solution {
public:
    double myPow(double x, int n) {
       long new_n = n;
       if(new_n < 0)
       {
           x = 1 / x;
           new_n = -new_n;
       }
       double res = 1.00000;
       while(new_n > 0)
       {
           if(new_n % 2 == 1) res *= x;
           x *= x; //x=x2
           new_n /= 2; //或者new_n>>1,右移一位,即删除最后一位
       }
       return res;
   }
};

面试题16:数值的整数次方(C++)

原文:https://www.cnblogs.com/wzw0625/p/12749341.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!