基本C程序,巴比伦算法

时间:2013-04-12 01:57:13

标签: c algorithm math integer double

我是C语言的新手,我正在尝试做一个我们在大学时给出的实验教程。

我们被要求做以下事情:

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

  1. 计算r = n / guess
  2. 设置猜测=(猜测+ r)/ 2
  3. 根据需要返回步骤2进行尽可能多的迭代。第2步和第3步越多 重复,越接近猜测将成为n的平方根。
  4. 编写一个为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”,但每次都会给出不同的巨大结果。

3 个答案:

答案 0 :(得分:3)

另一种解决方案是:

guess = guess / 2.0; 

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

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

您还需要将printf更改为:

printf("%f",guess);

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

http://www.cplusplus.com/reference/cstdio/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;

其次,因为guessdouble,您需要在%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;
}