c - 基本C程序,巴比伦算法

标签 c algorithm math integer double

我是C语言的新手,正在尝试做一个我们在大学里得到的实验教程。
我们被要求做以下工作:
任务1。
巴比伦算法计算数字n的平方根如下:
一猜猜答案(你可以选择n/2作为最初的猜测)。
计算r=n/猜测
设置guess=(guess+r)/2
根据需要,返回步骤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”左右,但每次都会给出不同的巨大结果。

最佳答案

这里有一些问题。
首先,您在循环中设置了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;
}

关于c - 基本C程序,巴比伦算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15961868/

相关文章:

c++ - 为什么此计数器以这种方式增加,而不是在这种分而治之算法中一个接一个地增加?

algorithm - 相邻位计数

java - 使用 ejml(或其他 Java 库)的矩阵索引

在 C 中组合打印语句

c - 在 Mac 上构建巧妙的国际象棋引擎

algorithm - F#:如何计算汉明距离?

python - 用Pygame绘制抛物线

matlab - 两条相交线之间的像素

c - 是否存在将文本文件转换为字符串文字作为构建步骤的任何东西?

c - 不兼容的返回类型