【校招面试 之 剑指offer】第16题 数值的整数次方

本文介绍了两种实现幂运算的方法:一种是直接迭代计算,适用于简单情况;另一种是使用递归分解,能有效减少计算量。文章特别关注了负指数与底数为0的特殊情况,并提供了C++代码示例。

方法1:直接求解,但是要注意特殊情况的处理:即当指数为负,且底数为0的情况。

#include<iostream>
using namespace std;

template<typename T>
T myPow(T a, int m){
	double base = 1;
	int flag = (m < 0) ? -1 : 1;
	int n = (m < 0) ? -m : m;

	while(n > 0){
		base = base * a;
		n --;
	}
	if(flag == -1){
		if(a != 0){
			return (1/base);
		}
		cout<<"当指数为负时,0不能作为底数!"<<endl;
		exit(-1);
	}
	return base;
}
int main(){

	double a = 0;
	// int a = 2;
	int n = 10;
	cout<<"求"<<a<<"的"<<n<<"次方为:"<<myPow(a, n)<<endl;
	system("pause");
	return 0;
}

方法2:可以归纳出下面的公式进行求解,使得循环次数大幅减小。也要注意特殊情况的处理:即当指数为负,且底数为0的情况。 

    an/2*an/2    n为偶数

a=                                     

     a(n-1)/2*a(n-1)/2*a    n为奇数

#include<iostream>
using namespace std;

// 符号处理(符号处理放在递归方法中出现问题,所以拿了出来)
template<typename T>
double myPow1(T a, int m){
	int flag = (m < 0) ? -1 : 1;
	int n = (m < 0) ? -m : m;
	double result = myPow2(a, n, flag);
	cout<<result<<endl;
	if(flag == -1){
		if(a != 0){
			return (1/result);
		}
		cout<<"当指数为负时,0不能作为底数!"<<endl;
		exit(-1);
	}
	return result;
}
template<typename T> T myPow2(T a, int n, int flag){ double result; if(n == 0){ return 0; } if(n == 1){ return a; } if(n%2 == 0){ result = myPow2(a, n/2, flag) * myPow2(a, n/2, flag); }else{ result = myPow2(a, (n-1)/2, flag) * myPow2(a, (n-1)/2, flag) * myPow2(a, 1, flag); } return result; } int main(){ double a = 0; // int a = 2; // int n = 8; int n = -10; cout<<"求"<<a<<"的"<<n<<"次方为:"<<myPow1(a, n)<<endl; system("pause"); return 0; }

  

转载于:https://www.cnblogs.com/xuelisheng/p/9364478.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值