【leetcode C语言实现】剑指 Offer 16.数值的整数次方

题目描述

实现函数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] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof

解题思路

本题采用快速幂法,将x^n分n为奇数和偶数进行不同计算,可实现时间复杂度O(logn)的解法,同时由于在C语言将负整数转换为正整数时,可能会有溢出情况,通过unsigned int m = (unsigned int)n转换排除溢出问题。

代码

double myPow(double x, int n){
    double res;

    if(x == 0)
        return 0;

    unsigned int m = (unsigned int)n;
    if(n < 0)
    {
        m = -m;
        x = 1 / x;
    }

    res = 1;
    while(m)
    {
        if(m & 1)
            res *= x;
        x *= x;
        m >>= 1;
    }

    return res;
}

测试代码及结果

#include
double myPow(double x, int n);

int main(void)
{
    printf("x = 2.1, n = 0, res = %lf\n", myPow(2.1, 0));
    printf("x = 2.1, n = 3, res = %lf\n", myPow(2.1, 3));
    printf("x = 2.1, n = -3, res = %lf\n", myPow(2.1, -3));
    printf("x = -2.1, n = 3, res = %lf\n", myPow(-2.1, 3));
    printf("x = -2.1, n = -3, res = %lf\n", myPow(-2.1, -3));
    printf("x = -2.1, n = 0, res = %lf\n", myPow(-2.1, 0));
    printf("x = 0.0, n = 3, res = %lf\n", myPow(0.0, 3));
    printf("x = 0.0, n = -3, res = %lf\n", myPow(0.0, - 3));
    printf("x = 0.0, n = 0, res = %lf\n", myPow(0.0, 0));

    return 0;
}

执行结果

时间复杂度:O(logn),空间复杂度:O(1)。


你可能感兴趣的:(【leetcode C语言实现】剑指 Offer 16.数值的整数次方)