这是原题:(是翻译过来的题目可能有些偏差)
编写一个程序,计算带小数位的数字的立方根。按着这些次序:
•用户应输入一个数字(它可以包含小数位,但不能为负数)。
•开始缩小根的范围:第一个下限是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。这个时候,它就找到了一个相当精确的立方根的近似值,然后输出这个值。