数值的整数次方15

本文介绍了一种不使用库函数实现幂运算的方法,并详细解释了解题思路、函数设计及测试用例。针对不同情况(如负指数、零的幂等),提供了具体的处理方式。

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

1.代码质量:资源回收、异常状况、对“正常值”进行的处理、功能错误、边界情况。
2.规范的代码:清晰的书写、布局、命名
3.关键是在写代码之前形成清晰的思路,并能把思路用编程语言清楚地写出来。
4.单元测试的设计:负面测试(即错误的输入)、功能测试、边界测试。
5.三种错误处理的方法,各有优缺点:
a.函数返回值。优:和系统一致。缺:不能方便的计算结果。
b.全局变量。优:函数返回值依然可以设置为结果,能够方便的使用计算结果。缺:用户可能忘记检查全局变量。
c.异常,try catch块。 优:可以为不同的出错原因定义不同的出错原因定义不同的异常类型,逻辑清晰明了。 缺:有些语言不支持异常,抛出异常时对性能有负面影响。

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

解题思路:

  1. 一个数值m的n次方等于n个m相乘,如:5^3 = 5*5*5; 所以无论n等于几都是m的自乘。若m为负数,需要取倒数。
  2. 指数为负数的时候,应先去绝对值,求出指数的结果之后,再求倒数。
  3. 0的0次方和0的负数次方无意义。

测试用例:

int main(){
    //(0.0 , 0)次方
    double res = Power(0.0, 0);
    if(g_InvalidInput) //记得检查全局变量
        std::cout << "(0.0, 0) : " << res << std::endl;//Output: 1
    else
        std::cout << "Invalid Input\n";

    //(3.3, 3)次方
    res = Power(3.3, 3);
    if(g_InvalidInput)
        std::cout << "(3.3, 3) : " << res << std::endl;  //Output: 35.937
    else
        std::cout << "Invalid Input\n";

    //(3.3, 0)次方
    res = Power(3.3, 0);
    if(g_InvalidInput)
        std::cout << "(3.3, 0) : " << res << std::endl; //Output: 1
    else
        std::cout << "Invalid Input\n";

    //(-3.3, 0)次方
    res = Power(-3.3, 0);
    if(g_InvalidInput)
        std::cout << "(-3.3, 0) : " << res << std::endl; //Output: 1
    else
        std::cout << "Invalid Input\n";

    //(0.0, -2)次方
    res = Power(0.0, -2);
    if(g_InvalidInput)
        std::cout << "(0.0, -2) : " << res << std::endl; //Output: Invalid Input
    else
        std::cout << "Invalid Input\n";

    return 0;
}

函数实现:

#include <iostream>
//全局变量(检查错误处理的方法)
bool g_InvalidInput = true;  //默认合法,缺点:需要在client检查全局变量。此举是为了区分底数为0的时候正常返回0还是出错的时候返回0。

//判断double值是否等于0
bool equal(double num1, double zero){
    //对于小数,将他们两个相减。结果若在一个极小的范围内,那么我们认为它们相等
    if( (num1 - zero > -0.0000001) && (num1 - zero) < 0.0000001)
        return true;
    else
        return false;
}

//迭代版解法
double PowerWithUnsignedExponent(double base, double exponent){
    if(exponent == 0)
        return 1;
    if(exponent == 1)
        return base;
    double result = 1.0;
    for(auto i = 1; i <= exponent; ++i)
        result *= base;
    return result;
}

//递归版解法
double RPowerWithUnsignedExponent(double base, unsigned int exponent){
    if(exponent == 0)
        return 1;
    if(exponent == 1)
        return base;
    double result = RPowerWithUnsignedExponent(base, exponent >> 1);
    result *= result;
    if(exponent & 0x1 == 1)
        result *= base;
    return result;
}

//主函数
double Power(double base, int exponent){
    if(equal(base, 0.0) && exponent < 0){ //判断base是否为0,在浮点数情况下无法直接和0比较,采取比较一个极小数来确定base是否为0
        g_InvalidInput = false; //不合法
        return 0.0; //由于不合法返回的0.0
    }
    unsigned int absExponent = (unsigned int) exponent;
    if(exponent < 0)
        absExponent = (unsigned int) (-exponent);
    //执行上面的判断及转换后后,再执行具体运算
    double result = PowerWithUnsignedExponent(base, absExponent);
    //若为负数,再求其倒数
    if(exponent < 0)
        result = 1.0 / result;
    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值