面試題------數值整數次方

問題要求

實現函數double Power(double base,int exponent),求base的exponent次方。不得使用庫函數,同時不需要靠考慮大數問題。

問題分析

看到這個問題,我覺得我跟大多數人想的是一樣,直接循環作乘法。但是仔細一想,考慮的還是太少了。從底數和指數兩方面分別考慮:


有這麼幾種情況我們不容忽視,1)對0求倒數出現異常,要做特殊處理;2)0的0次方是沒有任何意義的,需要做特殊處理;3)複次冪即將指數求絕對值,然後再將最後的結果取倒數即可。

仔細閱讀題目就會發現,題目要求底數類型是double型的,那麼在判斷底數是不是等於0時,不能直接判斷base == 0.(計算機在表示小數時都有誤差)。判斷兩個小數是否相等,只能判斷它們之差的絕對值是不是在一個很小的範圍中。所以將該判斷方法封裝成一個函數即可  bool equal(double x,double y);

代碼如下:

//全局變量用來標識出錯是因爲底數爲0且指數爲負數的情況
bool InvaildeInput = false;

//判斷兩個小數是否相等
bool equal(double x,double y)
{
	if ((x - y > -0.0000001) && (x - y < 0.0000001))
		return true;
	else
		return false;
}

//計算指數爲正整數時的整數次方
double PowerUnsignedExponent(double base,unsigned int exponent)
{
	double result = 1.0;
	for(unsigned int i = 1; i <= exponent; i++)
	{
		result *= base;
	}

	return result;
}

double Power(double base,int exponent)
{
	InvaildeInput = false;

	if (equal(base,0.0) && exponent < 0)
	{
		InvaildeInput = true;
		return 0.0;
	}

	unsigned int UnsignedExponent = (unsigned int)exponent;
	if (exponent < 0)
	{
		UnsignedExponent = (unsigned int)(-exponent);
	}

	double result = PowerUnsignedExponent(base,UnsignedExponent);

	if (exponent < 0)
	{
		result = 1.0 / result;
	}

	return result;
}

問題總結

在此基礎上,還有使用位運算來優化該算法的方法。這裏並沒有討論,還是想說要多思考,多寫。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章