11 数值的整数次方 | Power

本文介绍了如何不借助库函数,实现双精度浮点数与整数指数之间的幂运算,包括边界条件处理、优化计算过程及特殊情况的处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


解析:
首先想好测试案例,找出特殊情况
base 可能 正数、负数、0;exponent 可能正数、负数、0
(0,0) :无意义,返回 0 或 1 均可,应询问面试官
(0,-1):负面输入,不能对0取负数
(0,2): 0
(2,0)(-2,0):exponent == 0,返回1
(-2,2)(-2,-2):exponent < 0 时,先求 exponent 的绝对值幂结果,然后对结果取倒数

然后考虑是否能优化:发现如果求a的16次方,可以先求8次方,然后8次方平方;要求8次方,可以先求4次方,然后4次方平方,依次类推。。。(递归求解,需要考虑exponent的奇偶问题)

关键点:
1. 0 不能求负数次幂
2. double 型不能用”==”判断是否等于某值(精度问题),如果两者之差的绝对值小于一个设定的最小数,则可以认为它们是相等的。
3. 优化求幂的计算过程

#include <iostream>
using namespace std;
int g_error = 0;
double PowerWithUnsignedExponent(double base, unsigned int exponent);
bool equal(const double &d1, const double &d2);
double Power(double base, int exponent);
double abs(const double &d);
double Power(double base, int exponent)
{   
    if (equal(base, 0.0) && exponent < 0) {
        g_error = -1;
        return 0;
    }
    if (base == 0)
        return 0;
    if (exponent == 0)
        return 1.0;
    if (exponent > 0)
        return PowerWithUnsignedExponent(base, (unsigned int)exponent);
    if (exponent < 0)
        return 1.0/PowerWithUnsignedExponent(base, (unsigned int)(-exponent));
}
// 递归求无符号型指数的幂
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
    if (exponent == 0)
        return 1.0;
    if (exponent == 1)
        return base;
    double result = PowerWithUnsignedExponent(base, exponent>>1); // 除2操作,位操作更快
    result *= result;
    if (exponent & 0x01) // 判断奇偶
        result *= base;
    return result;
}

bool equal(const double &d1, const double &d2) 
{
    if (abs(d1-d2) < 0.00001)
        return true;
    else
        return false;
}
double abs(const double &d)
{
    return (d < 0) ? -d : d;
}


int main()
{
    cout << Power(0, 0) << endl;
    cout << Power(0, 2) << endl;
    cout << Power(0, -2) << endl;
    if(g_error == -1)
        cout << "error -1: 对 0 取倒数" << endl;
    cout << Power(-2,-2) << endl;
    cout << Power(-2,2) << endl;
    cout << Power(-2,3) << endl;
    cout << Power(-2,0) << endl;
    cout << Power(2,0) << endl;
    cout << Power(2,-2) << endl;
    cout << Power(2,2) << endl;
    return 0;
}
要计算数的数次可以使用暴力求解或者使用二分法。下面是两种法的示例代码: 法一:暴力求解 ```c++ class Solution { public: double Power(double base, int exponent) { bool isFu = false; if(exponent < 0) { exponent *= (-1); isFu = true; } double res = 1; for(int i = 0; i < exponent; i++) { res *= base; } if(isFu) return 1/res; return res; } }; ``` 法二:使用二分法 ```c++ class Solution { public: double Power(double base, int exponent) { bool isFu = false; // 判断是否为负数次根 if(exponent < 0) { exponent *= (-1); isFu = true; } bool isStrange = false; // 判断是否为奇数 if(exponent % 2 != 0) { isStrange = true; exponent -= 1; } int count = 0; // 记录除2次数 while(exponent != 0 && exponent % 2 == 0) { count++; exponent /= 2; } double res = 1; // 记录结果 // 该情况exponent一开始为奇数,比如7,那么7-1 = 6,6/2 = 3,即不管如何都应该进行3次暴力乘法 for(int i = 0; i < exponent; i++) { res *= base; } // 通过记录的count次数,本身*本身即可。 for(int i = 0; i < count; i++) { res *= res; } // 如果为奇数,还应该进行一次乘法 if(isStrange) { res *= base; } // 如果为负数次根 if(isFu) return 1/res; return res; } }; ``` 以上就是两种计算数次法,可以根据具体需求选择合适的法进行计算。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [数值数次(C++)](https://blog.csdn.net/qq135595696/article/details/125091372)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值