1. 程式人生 > >面試題16:數值的整數次方

面試題16:數值的整數次方

指數 遞歸 試題 family nes style signed 類型 turn

// 面試題16:數值的整數次方 // 題目:實現函數double Power(double base, int exponent),求base的exponent // 次方。不得使用庫函數,同時不需要考慮大數問題。

解題思路:

解題並不難,重要的是要考慮到輸入的各種情況,並且有相應的處理。

double和int都是可以取負數和0的,如果base取0,exponent<0,結果顯然是不存在的。

base取0,exponent取非負,直接返回1就可以了。

其他情況,正常運算就好,要註意如果exponent<0,應該取絕對值,完成冪次方之後再取倒數。

如果想提高代碼運行效率的話,可以使用遞歸或者循環來把a^n分解

a^n=a^(n/2)*a^(n/2),n為偶數

  a^((n-1)/2)*a^((n-1)/2)*a,n為奇數

還有一點需要註意的就是,float、double類型的變量不能用==來比較,應該另外寫個函數。

c/c++:

bool g_InvalidInput = false;
bool equal(double num1, double num2);
double PowerWithUnsignedExponent(double base, unsigned int absExp);

double Power(double base, int exponent) {
	//參數校驗
	if (equal(base, 0.0) && exponent < 0) {
		g_InvalidInput = true;
		return 0.0;
	}

	//對指數exponent取絕對值
	unsigned int absExp = (unsigned int)(exponent);
	if (exponent<0)
		absExp = (unsigned int)(-exponent);

	//計算pow(base,absExp)
	double result = PowerWithUnsignedExponent(base, absExp);
	//若exponent<0,取倒數
	if (exponent<0)
		result = 1.0 / result;

	return result;
}

double PowerWithUnsignedExponent(double base, unsigned int absExp) {
	//遞歸中止的邊界值
	if (absExp == 0)
		return 1;
	if (absExp == 1)
		return base;

	//簡化計算量
	double result = 0;
	result = PowerWithUnsignedExponent(base, absExp >> 1);
	result *= result;
	if (absExp & 0x1 == 1)
		result *= base;

	return result;
}

bool equal(double num1, double num2){
	//double不能直接用==比較
	if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
		return true;
	else
		return false;
}

參考資料:

劍指offer第二版面試題16

面試題16:數值的整數次方