关于求一个double类型的数的n次方根问题
如果一个数的n次方(n是大于1的整数)等于a,那么这个数叫做a的n次方根。习惯上,将2次方根叫做平方根,将3次方根叫做立方根。请你写一个函数实现上述功能。函数接口定义:
double nthroot(double x, int n);
其中 x 和 n 都是用户传入的参数,n是大于1的整数;本函数返回x的n次方根,主调函数保证实参的值是有效的。
裁判测试程序样例:
#include <stdio.h>
double nthroot(double x, int n);
int main(){
double x;
int n;
scanf("%lf%d", &x, &n);
printf("%.8f\n", nthroot(x, n));
return 0;
}
/* 请在这里填写答案 */
输入样例:
2 2
输出样例:
1.41421356
我想的是n次方根就是1/n次方,就用了pow函数,但是提交发现有几个测试点有问题,感觉应该是精度不够,求另一种算法。。 开平方可以使用牛顿迭代法,计算方法非常简单,但是,这种方法只适合求取平方根。 哪几个测试点有问题?
输入了什么?正确的结果是什么?你的程序给出的结果是什么?
不知道这几个问题的答案,你怎么调试程序?
#include <stdio.h>
#define abs(n) ((n) > 0 ? (n) : -(n))
double nthroot(double d , int n)
{
double f , fd , e , x0 , x1 = 1 ;
int i ;
do {
x0 = x1 ;
for(f = 1.0 , i = 0 ; i < n ; i ++) f *= x0 ;
f -= d ;
for(fd = n , i = 0 ; i < n - 1 ; i ++) fd *= x0 ;
x1 = x0 - f / fd ;
} while(abs(x1 - x0) > 1e-15) ;
return x1 ;
}
int main()
{
double x ;
int n ;
scanf("%lf%d", & x , & n) ;
printf("%.8f\n", nthroot(x, n)) ;
return 0 ;
}
运行实况:
D:\\C>g++ -o x x.c
D:\\C>x
27 3
3.00000000
D:\\C>x
2 2
1.41421356
D:\\C>x
100000 5
10.00000000
D:\\C> jackz007 发表于 2022-11-10 19:33
运行实况:
正确了!!谢谢大佬
页:
[1]