完整的题目:
实现函数double Power(double base, int exponent), 求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
C语言代码:
#include <stdio.h>
#include <stdbool.h>
bool g_invalid_input = false;
bool equal(double num1, double num2);
double power_with_unsigned_exponent(double base, unsigned int exponent);
double power(double base, int exponent);
int main(void)
{
double base = 1;
int exponent = 0;
printf("Enter base and exponent:\n");
scanf("%lf%d", &base, &exponent);
printf("%lf^%d=%lf\n", base, exponent, power(base, exponent));
return 0;
}
double power(double base, int exponent)
{
unsigned int abs_exponent = 0;
double result = 0.0;
g_invalid_input = false;
if (equal(base, 0.0) && exponent < 0){
g_invalid_input = true;
return 0.0;
}
abs_exponent = (unsigned int)(exponent);
if (exponent < 0)
abs_exponent = (unsigned int)(-exponent);
result = power_with_unsigned_exponent(base, abs_exponent);
if (exponent < 0)
result = 1.0 / result;
return result;
}
bool equal(double num1, double num2)
{
if ((num1 - num2 > -0.000001) && (num1 - num2 < 0.000001))
return true;
else
return false;
}
double power_with_unsigned_exponent(double base, unsigned int exponent)
{
double result = 1.0;
int i = 1;
for (i=1; i <= exponent; ++i)
result *= base;
return result;
}
因为an=an/2∗an/2(n为偶数),an=a(n−1)/2∗a(n−1)/2∗a(n为奇数)
更高效的power_with_unsigned_exponent函数写法
double power_with_unsigned_exponent(double base, unsigned int exponent)
{
double result;
if (0 == exponent)
return 1;
if (1 == exponent)
return base;
result = power_with_unsigned_exponent(base, exponent >> 1);
result *= result;
if (exponent & 0x1 == 1)
result *= base;
return result;
}
2251

被折叠的 条评论
为什么被折叠?



