【算法】数值的整数次方

版权声明:本文为博主原创学习笔记,如需转载请注明来源。 https://blog.csdn.net/SHU15121856/article/details/82421512

从三方面确保代码完整性

[1]功能测试

测试程序能否按预期完成功能。

[2]边界测试

测试一些输入的边界,看看程序还能不能正常运行。

[3]负面测试

测试一些不合法的输入,检验程序的鲁棒性。鲁棒性实际上就是程序能很好承受用户的各种输入(操作也是输入)的性质,即便要求了正确使用的输入,也要考虑到其它错误的输入,一般在程序中做特殊判断。

三种错误处理的方法

[1]返回值

用特殊的返回值来告诉调用者是否出错。优点是和系统API一致,缺点是不容易使用返回结果。

[2]全局变量

当错误发生时去修改全局变量。优点是到处都可以直接使用,缺点是使用者经常会忘记检查全局变量。

[3]抛出异常

C语言中没有,C++里也支持异常,这是各个高级语言强烈推荐的处理方式。优点是正常执行的try块和处理错误的catch块逻辑划分清晰,缺点是抛出异常时程序的执行会打乱正常的顺序,对程序性能有很大影响。

面试题16:数值的整数次方

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

实际上就是要求实现一个pow函数,需要注意各种特殊情况,单独拿出来判断一下就可以了。程序里还用了快速幂,移位等操作。

#include<bits/stdc++.h>
using namespace std;

bool g_InvalidInput = false;//标识出错的全局变量,出错时设为true
bool equal(double num1, double num2);
double PowerWithUnsignedExponent(double base, unsigned int exponent);

// 参数:
//        base:      底数
//        exponent:  指数
// 返回值:
//        base的exponent次幂
double Power(double base, int exponent) {
    g_InvalidInput = false;
    //如果是0的负数次幂,因为0不能做分母,所以出错
    if (equal(base, 0.0) && exponent < 0) {
        g_InvalidInput = true;//标记出错
        return 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;
}

// 参数:
//        base:      底数
//        exponent:  正指数
// 返回值:
//        base的exponent次幂
double PowerWithUnsignedExponent(double base, unsigned int exponent) {
    if (exponent == 0)
        return 1;//任何数的0次幂为1
    if (exponent == 1)
        return base;//任何数的1次幂为其本身

    //快速幂:递归调用自身计算指数的一半的次幂
    double result = PowerWithUnsignedExponent(base, exponent >> 1);
    result *= result;//再两个一半次幂乘起来就得到完整的了
    if ((exponent & 0x1) == 1)//如果最低位是1,即为奇数
        result *= base;//如7/2=3,3*3=6还差一份base,把它乘上
    return result;
}

//输入两个浮点数,只要它们的差值足够小即可判断为相等,返回是否相等 
bool equal(double num1, double num2) {
    if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
        return true;
    else
        return false;
}

int main(){
    cout<<Power(2,3)<<endl;
    cout<<Power(-2,-3)<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/SHU15121856/article/details/82421512
今日推荐