总结的部分题目思路与代码,待完善。
【剑指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为偶数的时候,
#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;
}