数值的整数次方

      在剑指offer上看了下面试题11:数值的整数次方,感觉各方面写得都很好。但是计算数值的非负数次方的那个函数(PowerWithUnsignedExponent()函数)用递归方式实现感觉效率不佳,有重复计算,故写了个非递归的函数,代码如下:

//非递归方式实现PowerWithUnsignedExponent
double NonRecursionPowerWithUnsignedExponent(double base,unsigned int exponent)
{
	double result=1;
	double newbase=base;
	while(exponent)
	{
	  if(exponent & 0x1)
		  result *=newbase;
	  newbase*=newbase;
	  exponent>>=1;
	}
	return result;
}

总体代码如下(没有用到全面的测试用例):

// 面试题11.cpp : 定义控制台应用程序的入口点。
//求数值的整数次方

#include "stdafx.h"
#include  <iostream>
#include <iomanip> 
using namespace std;

bool g_InvalidInput=false;

bool equal(double a,double b);
double PowerWithUnsignedExponent(double base,unsigned int exponent);
double NonRecursionPowerWithUnsignedExponent(double base,unsigned int exponent);

double Power(double base,int exponent)
{
   g_InvalidInput=false;
   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;
}

//递归方式实现PowerWithUnsignedExponent
double PowerWithUnsignedExponent(double base,unsigned int exponent)
{
  if(exponent==0)
	  return 1;
  if(exponent==1)
	  return base;
  //double result=PowerWithUnsignedExponent(base,exponent>>1);
  double result=NonRecursionPowerWithUnsignedExponent(base,exponent>>1);
  result*=result;
  if(exponent & 0x1)
	  result*=base;
  return result;
}

//非递归方式实现PowerWithUnsignedExponent
double NonRecursionPowerWithUnsignedExponent(double base,unsigned int exponent)
{
	double result=1;
	double newbase=base;
	while(exponent)
	{
	  if(exponent & 0x1)
		  result *=newbase;
	  newbase*=newbase;
	  exponent>>=1;
	}
	return result;
}

//判断两个double类型数据是否相等
bool equal(double a,double b)
{
   if((a-b)>-0.0000001 && (a-b)<0.0000001)
	   return true;
   return false;
}

int _tmain(int argc, _TCHAR* argv[])
{
	double result=Power(2.0,5);
	cout<<"2.0^5="<<fixed<<result<<endl;
	system("PAUSE");
	return 0;
}



你可能感兴趣的:(数值的整数次方)