上次我发布了一个求实数的整数次幂(递归版),这次在它的基础上写一个更高效的版本。
请编写函数,求任意实数的任意整数次幂。
函数原型
double Power(double x, int n);
说明:参数 x 为底数,n 为指数。若参数正确,则函数值为 x 的 n 次幂。若参数不正确,则显示一行错误信息:“不正确的参数!”,函数值为 0。
提示:
- x100=x50⋅x50
- x101=x50⋅x50⋅x
- 00 和 0−2 无意义
裁判程序
#include <stdio.h>
int IsOdd(int number);
int IsEven(int number);
double Power(double x, int n);
int main()
{
double x;
int n;
scanf("%lg%d", &x, &n);
printf("%.10g\n", Power(x, n));
return 0;
}
...(略)...
/* 你提交的代码将被嵌在这里 */
要求:不要调用 pow 等函数,不要使用循环语句。
说明:利用前面作业中编写的 IsOdd 和 IsEven 函数来判断奇数和偶数。
输入样例1
0 -2
输出样例1
不正确的参数!
0
输入样例2
0 5
输出样例2
0
输入样例3
-5.4 5
输出样例3
-4591.65024
输入样例4
2.53 -326
输出样例4
3.825692827e-132
关联习题:判断奇数,判断偶数。
判断奇数函数/偶数函数:奇数/偶数?1:0;
double Power(double x, int n)
{
double s;
if(x==0)
{
if(n<=0) printf("不正确的参数!\n");//当x=0且n<=0时输出
return 0;
}
else if(n==0)
return 1;//断点
else if(n>0)
{
if(IsEven(n))//当n为偶数时,执行如下语句。
{
s = Power(x,n/2);。
s = s*s;//x 100=x 50 ⋅x 50
}
else if(IsOdd(n))//n为奇数时,执行如下语句。
{
s = Power(x,n/2);
s = s*s*x;//x 101 =x 50 ⋅x 50 *⋅x
}
}
else if(n<0)//n<0时,和上面思路一样,只需要将x取倒数即可。
{
//x = 1/x;
n = -n;
s = 1/Power(x,n);//为了减少程序运行时间,将以下代码省略。
/*if(IsEven(n))
{
s = Power(x,n/2);
s = s*s;
}
else if(IsOdd(n))
{
s = Power(x,n/2);
s = s*s*x;
}*/
}
return s;
}