剑指Offer面试题16: 数值的整数次方

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

// 题目:实现函数double Power(double base, int exponent),求base的exponent

// 次方。不得使用库函数,同时不需要考虑大数问题。
代码实现如下:
#include<iostream>
using namespace std;

//考虑正负0指数,以及base是0的特殊情况 
double Power(double base,int exponent);
double Power_2(double base,int exponent);
double Power_2_core(double base,int exponent);

bool equal(double num1, double num2);//判断两个double值是否相等 

void test(double base,int exponent);

int main(){
	
	test(0,0);
	test(0,3);
	test(0,-4);
	test(2,0);
	test(3,1);
	
	test(3,5);
	
	test(3,-3);
	test(-3,-3);
	test(-4,3);
	
	return 0;
} 

void test(double base,int exponent){
	cout<<base<<"^"<<exponent<<" = "<<Power_2(base,exponent)<<endl; 
}

bool equal(double num1, double num2){
	if( (num1 - num2) > -0.0000001 || (num1 - num2) > 0.0000001)
		return true;
	return false;
} 

double Power(double base,int exponent){
	double res = 1;
	try{
		if(base == 0 && exponent < 0)
		{
			throw "0的指数不能为负数,没有意义"; 
		}
	}
	catch(const char *str){
		cout<<str<<endl;
		return 0.0;
	}	
	
	if(base == 0 && exponent == 0)
		return 0;	
	else if(base == 0)
		return 0;
	else if(exponent == 0)
		return 1;
	
	int exp = exponent;
	if(exp < 0){
		exp *= -1;
	}
	for(int i=0;i<exp;i++)
		res *= base;
	
	if(exponent < 0)
		res  = 1 / res;
		
	return res;
}

double Power_2(double base,int exponent){
	double res = 1;
	try{
		if(base == 0 && exponent < 0)
		{
			throw "0的指数不能为负数,没有意义"; 
		}
	}
	catch(const char *str){
		cout<<str<<endl;
		return 0.0;
	}	
	
	if(base == 0 && exponent == 0)
		return 0;	
	else if(base == 0)
		return 0;
	else if(exponent == 0)
		return 1;
		
	if(exponent > 0)
		return Power_2_core(base,exponent);
	else{
		return 1 / Power_2_core(base,-1 * exponent);	
	}
		
}

double Power_2_core(double base,int exponent){	
	if(exponent == 1)
		return base;
	if(exponent == 0)
		return 1;
	
	/* 
	if(exponent %2 == 0){
		return Power_2_core(base,exponent / 2) * Power_2_core(base,exponent / 2);
	}else
		return Power_2_core(base,(exponent-1) / 2) * Power_2_core(base,(exponent-1) / 2) * base;
	*/ 
	
	double result = Power_2_core(base,exponent >> 1);
	result *= result;
	if(exponent &0x1 == 1)
		result *= base;
	return result;
	
}

运行结果如下:


猜你喜欢

转载自blog.csdn.net/qq_29762941/article/details/80861620
今日推荐