1. 程式人生 > >【校招面試 之 劍指offer】第16題 數值的整數次方

【校招面試 之 劍指offer】第16題 數值的整數次方

iostream 面試 直接 lse cpp sin 校招 ack 整數次方

方法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為偶數

an =

    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; }

  

【校招面試 之 劍指offer】第16題 數值的整數次方