鱼C论坛

 找回密码
 立即注册
查看: 2566|回复: 4

[已解决]关于求一个double类型的数的n次方根问题

[复制链接]
发表于 2022-11-10 15:28:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如果一个数的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函数,但是提交发现有几个测试点有问题,感觉应该是精度不够,求另一种算法。。
最佳答案
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:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
27 3
3.00000000

D:\[00.Exerciese.2022]\C>x
2 2
1.41421356

D:\[00.Exerciese.2022]\C>x
100000 5
10.00000000

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-10 16:17:02 | 显示全部楼层
         开平方可以使用牛顿迭代法,计算方法非常简单,但是,这种方法只适合求取平方根。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-10 16:58:12 | 显示全部楼层
哪几个测试点有问题?
输入了什么?正确的结果是什么?你的程序给出的结果是什么?
不知道这几个问题的答案,你怎么调试程序?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
27 3
3.00000000

D:\[00.Exerciese.2022]\C>x
2 2
1.41421356

D:\[00.Exerciese.2022]\C>x
100000 5
10.00000000

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-10 22:38:27 | 显示全部楼层

正确了!!谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 08:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表