1

我是 C 语言的新手,正在尝试做一个我们在 uni 提供的实验室教程。

我们被要求做以下事情:

任务 1. 计算数字 n 的平方根的巴比伦算法如下: 1. 猜测答案(您可以选择 n/2 作为初始猜测)。

  1. 计算 r = n / 猜测
  2. 设置猜测 = (猜测 +r) / 2
  3. 根据需要返回步骤 2 进行尽可能多的迭代。步骤 2 和 3 重复的次数越多,猜测就越接近 n 的平方根。

编写一个程序,为 n 输入一个整数,对巴比伦算法进行五次迭代,并将答案输出为小数点后两位。对于较小的 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”左右,但每次都会给出不同的巨大结果。

4

3 回答 3

3

另一种解决方案是:

guess = guess / 2.0; 

这将“强制”进行浮点运算。

并且变量guess已经在范围内。你不能重新声明它(就像你在循环中所做的那样)。您只能将其设置为新值。

而且您还需要将其更改printf为:

printf("%f",guess);

检查此链接以获取有关 printf 格式化程序的更多信息:

http://www.cplusplus.com/reference/cstdio/printf/

于 2013-04-12T02:10:55.310 回答
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);

于 2013-04-12T01:59:39.477 回答
2

这里有一些问题。

guess首先,您已经确定了循环内部的第二个实例的范围。拿走double那条线上的声明。所以它应该变成:

guess = (guess + r) / 2;

其次,因为guessdouble你需要在调用中使用%f而不是。%dprintf

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;
}
于 2013-04-12T02:00:12.200 回答