即编写函数实现pow()函数的功能,求数值base的exponent次方。
在不考虑指数为非正值的情况下,代码很简单:
#include <stdio.h>
double Power(double base, int exponent)
{
double result = 1.0;
for (int i = 1; i <= exponent; i++)
{
result *= base;
}
return result;
}
int main()
{
double m;
int n;
printf("请输入底数m和指数n:");
scanf("%lf %d", &m, &n);
double result = Power(m, n);
printf("%.2f的%d次方是%.2f\n", m, n, result);
return 0;
}

此代码只能处理exponent>0的情况,但是实际应用中多数情况下都是指数为小数的情况,很显然,这种思想不适用于所有的情况。
改进:当指数是负数的时候,我们可以先对指数求绝对值,之后再对算出次方的结果取倒数。但是,如果结果为0,而0却没有倒数,这时候就要进行特殊处理了。
#include <stdio.h>
double Power(double base, int exponent)
{
double result = 1.0;
for (int i = 1; i <= exponent; i++)
{
result *= base;
}
return result;
}
int main()
{
double m, result;
int n;
printf("请输入底数m和指数n:");
scanf("%lf %d", &m, &n);
if (m == 0.0)
{
printf("输入非法!\n");
}
if (n < 0)
{
n = -n;
result = 1.0 / Power(m, n);
printf("%.2f的%d次方是%f\n", m, -n, result);
}
else
{
result = Power(m, n);
printf("%.2f的%d次方是%f\n", m, n, result);
}
return 0;
}



以上代码可以匹配所有情况,但还是显得有点繁琐。我们假设要计算的指数为32,那么我们只需要在16次方的基础上再平方即可,而16次方就是8次方的平方……,这样以此类推,一个数的32次方只需要做5次乘法运算。即当n为偶数时,a^n = a^(n/2)*a^(n/2),当n为奇数时,a^n = a^((n-1)/2)*a^((n-1)/2)*a。于是改进后的代码为:
#include <stdio.h>
double Power(double base, int exponent)
{
if (exponent == 0)
{
return 1;
}
if (exponent == 1)
{
return base;
}
double result = Power(base, exponent >> 1);
result *= result;
if (exponent & 0x1 == 1)
{
result *= base;
}
return result;
}
int main()
{
double m, result;
int n;
printf("请输入底数m和指数n:");
scanf("%lf %d", &m, &n);
if (m == 0.0)
{
printf("输入非法!\n");
}
else
{
if (n < 0)
{
n = -n;
result = 1.0 / Power(m, n);
printf("%.2f的%d次方是%f\n", m, -n, result);
}
else
{
result = Power(m, n);
printf("%.2f的%d次方是%f\n", m, n, result);
}
}
return 0;
}
365

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



