灯火阑珊201 发表于 2022-11-10 15:28:23

关于求一个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函数,但是提交发现有几个测试点有问题,感觉应该是精度不够,求另一种算法。。

jackz007 发表于 2022-11-10 16:17:02

         开平方可以使用牛顿迭代法,计算方法非常简单,但是,这种方法只适合求取平方根。

人造人 发表于 2022-11-10 16:58:12

哪几个测试点有问题?
输入了什么?正确的结果是什么?你的程序给出的结果是什么?
不知道这几个问题的答案,你怎么调试程序?

jackz007 发表于 2022-11-10 19:33:22

#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>

灯火阑珊201 发表于 2022-11-10 22:38:27

jackz007 发表于 2022-11-10 19:33
运行实况:

正确了!!谢谢大佬
页: [1]
查看完整版本: 关于求一个double类型的数的n次方根问题