【剑指offer】面试题16:数值的整数次方【C++版本】

总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】

题目:

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

解题思路:

1.这个题目看起来很简单,但其实考察的是考虑到边界问题和错误输入
2.应该分别分析底数和指数大于0、等于0、小于0的情况

两种最特殊的情况:
1.当底数为0而指数为负数的时候,是错误输入。
2.当指数为负数的时候,需要求倒数。


可以AC的解法一【C++版本】

#include <vector>                   
#include <iostream>                 
#include <string>                   
#include <string.h>                 

using namespace std;                

//判断底数是否为0,这里要注意底数是一个double类型
//而由于计算机储存精度的问题,不能使用等于符号来直接判断double之间是否相等
//需要使用两个double求减法后和一个极小值比大小来判断是否相等                           
bool isZero(double base)                                        
{                                   
    if((base - 0.0 < 0.000000001) && (base - 0.0 > 0.000000001))                                                                                                                                                                            
        return true;                
    else                            
        return false;               
}                                              

double Power(double base, int exponent)
{                                   
    //如果底数为0且指数为负,是一个错误输入,返回0                           
    if(isZero(base) && exponent < 0)return 0;     
    //指数为0闭返回1                                
    if(exponent == 0)return 1;      
    //指数为负数需要对底数求导                                
    if(exponent < 0){               
        base = 1./base;             
        exponent = -exponent;       
    }                               

    double resu = 1.;                  
    while(exponent){                
        resu *= base;               
        exponent--;                          
    }                               

    return resu;                    
}                                   

int main()                          
{                                   
    double base;                    
    int exponent;                               

    while(cin >> base >> exponent){ 
        cout << endl << Power(base,exponent) << endl;
    }                               

    return 0;                       
} 

可以AC的解法二【C++版本】

更高效率的方法,即乘法的次数为指数的次数的一半即可,exponent/2
例如求a的n次方,当n为偶数的时候,

a n = a n / 2 × a n / 2
当n为奇数的时候,
a n = a ( n 1 ) / 2 × a ( n 1 ) / 2 × a

#include <vector>              
#include <iostream>
#include <string>
#include <string.h>

using namespace std;

bool isZero(double base)
{
    if((base - 0.0 < 0.000000001) && (0.0 - base < 0.000000001))
        return true;
    else
        return false;
}

//使用递归来求解
double recursivePower(double base,int exponent)
{
    if(exponent == 0)return 1;
    if(exponent == 1)return base;

    double tmp = recursivePower(base,exponent>>1);
    double resu = tmp*tmp;
    //指数为奇数的情况
    if(exponent&0x1){
        resu *= base;
    }

    return resu;
}

double Power(double base, int exponent)
{

    if(isZero(base) && exponent < 0)return 0;

    if(exponent == 0)return 1;

    if(exponent < 0){
        base = 1./base;
        exponent = -exponent;
    }

    double resu = recursivePower(base,exponent);

    return resu;
}

int main()
{
    double base;
    int exponent;

    while(cin >> base >> exponent){
        cout << endl << Power(base,exponent) << endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37950361/article/details/80671084