Basic C程序,巴比伦算法
我是C语言的新手,我正在尝试做一个我们在大学里得到的实验教程 我们被要求做以下工作: 任务1。 计算数字n平方根的巴比伦算法如下: 1.对答案进行猜测(您可以选择n/2作为初始猜测)Basic C程序,巴比伦算法,c,algorithm,math,integer,double,C,Algorithm,Math,Integer,Double,我是C语言的新手,我正在尝试做一个我们在大学里得到的实验教程 我们被要求做以下工作: 任务1。 计算数字n平方根的巴比伦算法如下: 1.对答案进行猜测(您可以选择n/2作为初始猜测) 计算r=n/猜测 设置猜测=(猜测+r)/2 根据需要返回步骤2进行尽可能多的迭代。第2步和第3步执行得越多 重复,越接近n的平方根 编写一个程序,输入n的整数,迭代巴比伦算法 五次,并以双精度到小数点后两位的形式输出答案。你的回答会 对于较小的n值,最精确 以下是我写的: #include <stdio.h
#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);
}
#包括
#包括
int n;
主(空){
printf(“输入n:”的值);
scanf(“%d”和“&n”);
双猜测=n/2;
对于(int i=0;i<5;i++){
双r=n/猜测;
双猜测=(猜测+r)/2;
}
printf(“%d”,猜测);
}
我哪里出错了?它吐出了荒谬的结果;例如,如果我输入“4”作为n,答案应该在“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);
inti;
浮点数n,猜测=1;
printf(“\n输入数字:”);
scanf(“%f”、&n);
因为(i=0;i巴比伦算法对我来说似乎不正确,它应该是这样的
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);
inti;
浮点数n,猜测=1;
printf(“\n输入数字:”);
scanf(“%f”、&n);
对于(i=0;i这里有一些错误
首先,您已经在循环中确定了guess
的第二个实例的范围。去掉该行上的double
声明。因此它应该是:
guess = (guess + r) / 2;
其次,因为guess
是一个double
,所以在printf
调用中需要使用%f
而不是%d
printf( "%f", guess );
一旦你得到它,考虑运行算法直到达到一定的精度。< /P>
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;
}
这里有几件事不对
首先,您已经在循环中确定了guess
的第二个实例的范围。去掉该行上的double
声明。因此它应该是:
guess = (guess + r) / 2;
其次,因为guess
是一个double
,所以在printf
调用中需要使用%f
而不是%d
printf( "%f", guess );
一旦你得到它,考虑运行算法直到达到一定的精度。< /P>
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;
}
另一个解决办法是:
guess = guess / 2.0;
这将“强制”浮点操作
变量guess
已经在作用域中。不能重新声明它(就像在循环中所做的那样)。只能将其设置为新值
您还需要将printf
更改为:
printf("%f",guess);
有关printf格式化程序的更多信息,请查看此链接:
另一种解决方案是:
guess = guess / 2.0;
这将“强制”浮点操作
变量guess
已经在作用域中。不能重新声明它(就像在循环中所做的那样)。只能将其设置为新值
您还需要将printf
更改为:
printf("%f",guess);
有关printf格式化程序的更多信息,请查看此链接:
谢谢,这很有效,两个答案都是关于钱的;但是我如何让它打印到小数点后2位?格式说明符“%.2f”
。是否需要“%.2lf”
,还有争议。我认为浮动在变量参数列表中隐式转换为双精度。%lf
与%f相同
,l
修饰符只影响整数类型。float
被转换为变量函数的double
,因此%f
就足够了。在支持长双精度
的系统上,应该使用%Lf
格式说明符(注意:大写l
)。谢谢,这很有效,两个答案都在钱上;但是我如何让它打印到小数点后2位?格式说明符“%.2f”
。是否需要“%.2lf”
。我认为浮动在变量参数列表中隐式转换为双精度。%lf
与%f>相同
,l
修饰符只影响整数类型。float
被转换为变量函数的double
,因此%f
就足够了。在支持长双精度
的系统上,应该使用%Lf
格式说明符(注意:大写l
)。值得指出的是,这个答案解决了输入小于2的不良行为,因为除以0:double r=n/guess;
。在进入该循环之前,可能也应该进行检查以确保n>0
。值得指出的是,这个答案解决了输入小于2的不良行为大于2,因为被零除:double r=n/guess;
。在进入该循环之前,可能也应该进行检查以确保n>0
。