题目11 数值的整数次方
/////////////////////////////////////////////////////////////////////////////////////
// 1. 题目11 数值的整数次方
// 1.1 没有考虑负数和0的情况!!!! double Power(double dBase, int iExponent) { double dRes = 1.0; for (int i = 0; i < iExponent; i++) { dRes *= dBase; } return dRes; } // 判断两个double是否相等 bool Equal(double lhs, double rhs) { if ((lhs - rhs > -0.0000001) && (lhs - rhs < 0.0000001)) { return true; } return false; } double PowerWithUnsignedExponent(double dBase, unsigned int uiExponent) { double dResult = 1.0; for (unsigned int i = 1; i <= uiExponent; i++) { dResult *= dBase; } return dResult; } // 1.2 全面但不够高效的算法 double Power_1(double dBase, int iExponent) { double dResult = 0.0; if (Equal(dBase, 0.0) && iExponent < 0) { return dResult; } unsigned int absExponent = (unsigned int)iExponent; if (iExponent < 0) { absExponent = (unsigned int)(-iExponent); } dResult = PowerWithUnsignedExponent(dBase, absExponent); if (iExponent < 0) { dResult = 1.0 / dResult; } return dResult; } // 1.3 全面且高效的解法 // eg 如果输入iExponent = 32, PowerWithUnsignedExponent中需要循环31次 // 另一种解法: (a)32 --> ((a)16)2 --> (((a)8)2)2 -> ... --> (((((a)2)2)2)2)2 --> 运行5次 double NewPowerWithUnsignedExponent(double dBase, unsigned int uiExponent) { if (0 == uiExponent) { return 1.0; } else if (1 == uiExponent) { return dBase; } double dResult = NewPowerWithUnsignedExponent(dBase, uiExponent >> 1); dResult *= dResult; // 如果是基数 if (uiExponent & 0x01) { dResult *= dBase; } return dResult; } double Power_2(double dBase, int iExponent) { double dResult = 0.0; if (Equal(dBase, 0.0) && iExponent < 0) { return dResult; } unsigned int absExponent = (unsigned int)iExponent; if (iExponent < 0) { absExponent = (unsigned int)(-iExponent); } dResult = NewPowerWithUnsignedExponent(dBase, absExponent); if (iExponent < 0) { dResult = 1.0 / dResult; } return dResult; } void PowerTestFunc() { cout << "\n\n --------------- PowerTestFunc Start -------------->" << endl; int aiArray[] = {-3, -2, -1, 0, 1, 2, 3, 4, 5, 6}; int iLen = sizeof(aiArray) / sizeof(int); double dBase = 5; cout << "方法一: ==========================>>" << endl; for (int i = 0; i < iLen; i++) { printf("[%lf] 的 %d 次方: %lf\n", dBase, aiArray[i], Power(dBase, aiArray[i])); } cout << "方法二: ==========================>>" << endl; for (int i = 0; i < iLen; i++) { printf("[%lf] 的 %d 次方: %lf\n", dBase, aiArray[i], Power_1(dBase, aiArray[i])); } cout << "方法三: ==========================>>" << endl; for (int i = 0; i < iLen; i++) { printf("[%lf] 的 %d 次方: %lf\n", dBase, aiArray[i], Power_2(dBase, aiArray[i])); } cout << "\n\n --------------- PowerTestFunc End -------------->" << endl; }