<C语言> 如何用取中间值的方法算出立方根?大佬们帮帮忙

这是原题:(是翻译过来的题目可能有些偏差)

编写一个程序,计算带小数位的数字的立方根。按着这些次序:

•用户应输入一个数字(它可以包含小数位,但不能为负数)。

•开始缩小根的范围:第一个下限是1,上限是输入的数字本身,多维数据集的根必须介于两者之间。 o如果输入的数字小于1,则为下限,而1为上限。

•第一次尝试将上限和下限恰好在中间。

•如果该中心太大(因为中心³大于输入的数字),则将其用作新的上限。如果太小,请将其用作新的下限。 重复此过程,直到找到的中心足够准确为止,即,直到下限和上限之间的距离最大为0.001。然后输出找到的中心。

•通过最终输出使用pow()函数计算出的立方根来测试您的程序。

 

PS:这是我用牛顿迭代法写的,不确定符合不符合要求

double result(double a,double x0)
{
    double x1,y;
    x1=(2*x0+a/(x0*x0))/3.0;
    if(fabs(x1-x0)>=0.001)
        y=result(a,x1);
    else
        y=x1;
    return y;
}

int main()
{
    double x;
    printf("Enter x: ");
    scanf("%lf",&x);
    while (x<0)
    {
        printf("ERROR!");
        return;
    }
    printf("The result of %lf is %lf \n",x, result(x,1.0));
    printf("The checking result is %lf\n", pow(x,0.3333333));

    return 0;
}

 

你的牛顿迭代法的解决方案是非常有效的,但题目中要求使用的方法是二分查找(也就是取中间值的方法)。以下是用二分查找来实现这个题目的一个可能的C语言解决方案:

#include <stdio.h>
#include <math.h>

double cubeRoot(double num) {
    double low, high, mid;
    
    if(num < 1) {
        low = num;
        high = 1;
    } else {
        low = 1;
        high = num;
    }
    
    while(high - low > 0.001) {
        mid = (high + low) / 2;
        if(mid*mid*mid > num) {
            high = mid;
        } else {
            low = mid;
        }
    }

    return (high + low) / 2;
}

int main() {
    double num;

    printf("Enter a number: ");
    scanf("%lf", &num);
    if(num < 0) {
        printf("ERROR! Number must be non-negative.\n");
        return -1;
    }

    double root = cubeRoot(num);
    printf("The cube root of %.2f is approximately %.2f\n", num, root);
    printf("Checking with pow(): %.2f\n", pow(num, 1.0/3.0));

    return 0;
}

这个程序首先检查输入的数字是否小于1,然后设置了适当的起始上限和下限。然后它进入一个循环,不断地将上限和下限的中间值与原始数字的立方进行比较,根据比较的结果来调整上限和下限。这个过程会一直持续,直到上限和下限之间的差小于0.001。这个时候,它就找到了一个相当精确的立方根的近似值,然后输出这个值。