我是C语言的新手,我正在尝试做一个我们在大学时给出的实验教程。
我们被要求做以下事情:
任务1。 用于计算数n的平方根的巴比伦算法如下: 1.猜测答案(您可以选择n / 2作为初始猜测)。
编写一个为n输入整数的程序,遍历Babylonian算法 五次,并将答案输出为两位小数后两位。你的答案会 对于n的小值,最准确。
这是我写的:
#include <stdio.h>
#include <math.h>
int n;
main(void){
printf("Enter a value for n: ");
scanf("%d",&n);
double guess = n / 2;
for (int i = 0; i < 5; i++) {
double r = n / guess;
double guess = (guess + r) / 2;
}
printf("%d",guess);
}
我哪里出错了?它吐出了荒谬的结果;例如,如果我输入“4”作为n,答案应该是“2”,但每次都会给出不同的巨大结果。
答案 0 :(得分:3)
另一种解决方案是:
guess = guess / 2.0;
这将“强制”进行浮点运算。
变量guess
已经在范围内。你不能重新声明它(就像你在循环中所做的那样)。您只能将其设置为新值。
您还需要将printf
更改为:
printf("%f",guess);
检查此链接以获取有关printf格式化程序的更多信息:
答案 1 :(得分:2)
巴比伦算法对我来说似乎不对,它应该是这样的,
int i;
float n,guess=1;
printf("\nEnter the Number: ");
scanf("%f",&n);
for(i=0;i<PRECISION;i++)
{
guess=(guess+n/guess)/2;
}
printf("\nThe Square root of %f is %f",n,guess);
您的计划中还有其他可能的错误,
可能存在整数除法的问题,
第double guess = n / 2;
行
应为double guess = (double) n / 2;
printf()
也应为printf("%lf",guess);
答案 2 :(得分:2)
这里有些不妥之处。
首先,您已在循环中确定了guess
的第二个实例。拿走该行的double
声明。所以应该成为:
guess = (guess + r) / 2;
其次,因为guess
是double
,您需要在%f
来电中使用%d
而不是printf
。
printf( "%f", guess );
一旦你开始工作,考虑运行算法,直到达到一定的准确度。
const double epsilon = 0.0001;
double guess = (double)n / 2.0;
double r = 0.0;
while( fabs(guess * guess - (double)n) > epsilon )
{
r = (double)n / guess;
guess = (guess + r) / 2.0;
}