求某个数的整数次方

题目:实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。

分析:在开始写“主要”的功能代码之前,别忘了对输入数据base和exponent进行检查!exponent是int类型,故有正负之分,为正时,比较简单;为负时,要取分数的,别忘了;还有为0的情况,当base不为0时,任何非0数的0次方等于0(没错吧?忘了,不清楚请百度),当base也为0时,0的0次方是没有意义的,可以返回错误代码。

这里直接求解的代码应该不难写,这里先考虑比较简单的情况,即base非0,exponent大于0。

}

当然,有更好的解法,不然就不写这blog了。。。

更好的解法是基于下面的想法:

比如求X16,可以分解成:X16=X8*X8,于是,只要求出X8,再做一个乘积就可得到X16,同理,X8=X4*X4,……依次类推。所以求X16,只需要做4次乘积:X*X、X2*X2、X4*X4、X8*X8。如果用上面代码所述方法,要进行15次乘积。

现在问题变成,怎么把exponent分解成2的若干个整数次方,尤其是当exponent不是2的整数次方时,比如6。这里就用到了二进制的一些特点,比如6的二进制为0110,6可以分解为4+2,二进制熟悉的话,这里应该是一眼可以看出来的,就是对应二进制为1的位所表示的数的和。则X6=X4*X2

作者也给出这种方法的一种实现,是比较容易理解的,用一个包含32个int的数组存储每一位对应的乘积,最终结果就是所有32个乘积的乘积。说得不清楚?结尾给你链接仔细去看……

我觉得另外一种实现更简单,也更快。

// PowerWithUnsignedExponent.cpp : 定义控制台应用程序的入口点。
//

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

double Power(double base, int exponent)
{
bool exponentIsFuShu=false;
double result=1,temp=base;
if (exponent==0)
{
return 1;
}
if (exponent<0)
{
exponentIsFuShu=true;
}
if (exponent==1)
{
return base;
}
if (exponentIsFuShu)
{
exponent=-exponent;
}
for (int i=exponent;i>0;i/=2)
{
if (i%2==1)//是个奇数
{
result*=temp;
}
temp*=temp;
}
if (exponentIsFuShu)
{
result=1.0/result;
return result;
}
return result;
}


int _tmain(int argc, _TCHAR* argv[])
{
//cout<<Power(2,-3)<<endl;
cout<<Power(2,3)<<endl;
system("pause");
return 0;
}


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

double Power(double base,  int exponent)
{
 bool exponentIsFuShu=false;
 double result=1,temp=base;
 if (exponent==0)
 {
  return  1;
 }
 if (exponent<0)
 {
  exponentIsFuShu=true;
 }
 if (exponent==1)
 {
  return base;
 }
 if (exponentIsFuShu)
 {
  exponent=-exponent;
 }
 for (int i=exponent;i>0;i/=2)
 {
  if (i%2==1)//是个奇数
  {
   result*=temp;
  }
  temp*=temp;
 }
 if (exponentIsFuShu)
 {
  result=1.0/result;
  return result;
 }
 return result;
}

 


int _tmain(int argc, _TCHAR* argv[])
{
 //cout<<Power(2,-3)<<endl;
 cout<<Power(2,3)<<endl;
 system("pause");
 return 0;
}

 


这几行代码做的事是一样的。t每次除以2表示t向右移动1位,t%2==1时,表示最右边的位为1,所以这里做的事是一样的。从t(也就是exponent)的二进制的最右边位(最低位)开始,如果为0,则不需要相乘,然后考虑第二位(通过移位实现),并且,这里用tmp来保存二进制中相应位对应的乘积,如果哪一位为1,刚把它乘到结果中去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值