【问题标题】:Basic C Program, Babylonian Algorithm基础 C 程序,巴比伦算法
【发布时间】:2013-04-12 01:57:13
【问题描述】:

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

我们被要求做以下事情:

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

  1. 计算 r = n / 猜测
  2. 设置guess = (guess +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”左右,但每次都会给出不同的巨大结果。

【问题讨论】:

    标签: c algorithm math integer double


    【解决方案1】:

    另一种解决方案是:

    guess = guess / 2.0; 
    

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

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

    您还需要将printf 更改为:

    printf("%f",guess);
    

    查看此链接了解有关 printf 格式化程序的更多信息:

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

    【讨论】:

      【解决方案2】:

      这里有一些问题。

      首先,您已经在循环内限定了guess 的第二个实例。删除该行上的double 声明。所以它应该变成:

      guess = (guess + r) / 2;
      

      其次,因为guessdouble,您需要在printf 调用中使用%f 而不是%d

      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;
      }
      

      【讨论】:

      • 谢谢,这有效,两个答案都在钱上;我如何让它打印到小数点后 2 位呢?
      • 格式说明符"%.2f"。是否需要"%.2lf" 值得商榷。我认为浮点数在变量参数列表中被隐式转换为双精度。
      • "%lf""%f" 相同,l 修饰符仅影响整数类型。 float 被转换为 double 用于可变参数函数,所以 "%f" 就足够了。在支持long double 的系统上,应使用"%Lf" 格式说明符(注意大写L)。
      【解决方案3】:

      巴比伦算法对我来说似乎不正确,应该是这样的,

         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 的不良行为,因为除以零:double r = n / guess;。在进入该循环之前,可能也应该检查以确保n &gt; 0
      猜你喜欢
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 2020-05-12
      相关资源
      最近更新 更多