我的代码是工作。我做了一个算法,取一个数字,求出这个数字的平方根的底和顶(例如,如果我想求出5的平方根,那么底是2,顶是5。这意味着5的平方根在这些数字之间。但是当我输入像5或5这样的数字时,我的代码会循环。为什么?
int-raiz_-inteira(int-valor)
{
int impar=1,cont=0;
while(英勇>;=impar)
{
英勇=英勇-英帕尔;
cont++;
impar+=2;
}
返回控制;
}
浮动汇率(浮动汇率、整数基数、整数提托)
{
浮动介质=(基础+teto)/2.0;
浮动误差=介质*介质电压;
printf(“f\n”,媒体);
如果(错误<;0)
{
误差*=-1;
}
else if(erro==0)
{
返回媒体;
}
而(误差大于0.1)
{
printf(“f”,媒体);
if(媒体*媒体>;勇气)
{
teto=媒体;
}
其他的
{
基本=媒体;
}
媒体=(基本+teto)/2.0;
erro=媒体*媒体勇气;
如果(错误<;0)
{
误差*=-1;
}
}
}
void main()
{
内特提托,基地,拉伊兹;
printf(“键入一个数字:\n”);
scanf(“d”和“raiz”);
基数=raiz_inteira(raiz);
teto=base+1;
莱兹埃克斯塔(莱兹,基地,泰托);
}
您的代码已清理,便于阅读:
#包括<;stdio.h>;
内特莱兹乌因特拉(内特瓦洛尔){
int impar=1,cont=0;
while(英勇>;=impar){
英勇-=顽皮;
cont++;
impar+=2;
}
返回控制;
}
浮动汇率(浮动汇率、整数基数、整数提托){
浮动介质=(基础+teto)/2.0;
浮动误差=介质*介质-电压;
printf(“f\n”,媒体);
如果(错误<;0){
误差*=-1;
}
else if(erro==0){
返回媒体;
}
而(误差大于0.1){
printf(“f”,媒体);
if(媒体*媒体>;勇气){
teto=媒体;
}
否则{
基本=媒体;
}
媒体=(基本+teto)/2.0;
erro=媒体*媒体-勇气;
如果(错误<;0){
误差*=-1;
}
}
}
void main(){
内特提托,基地,拉伊兹;
printf(“键入一个数字:\n”);
scanf(“d”和“raiz”);
基数=raiz_inteira(raiz);
//printf(“基:%d\n”,基);
teto=base+1;
//printf(“teto:%d\n”,teto);
莱兹埃克斯塔(莱兹,基地,泰托);
}
现在,让我们运行这个,输入5
当我们开始时,raiz
是5,base
是raiz_inteira(5)
,计算结果是2
,teto
是3
因此,我们使用raiz_exata(5.0,2,3)
输入raize_exata
在这个函数中,media
是2.5
,erro
是2.5*2.5-5.0
,它等于1.25
请记住,浮动并不总是精确的值。
打印2.5
值
1.25
既不小于0
,也不等于0
,因此跳过条件
进入while循环,我们再次打印2.5
。因为2.5*2.5
大于5.0
teto
设置为2
,因为teto
是int
然后,我们将媒体
更新为base+teto/2.0
,这也是2.5
,因此没有更改。因为没有更改,错误
没有更改。因为它不小于0
,所以跳过条件
下一次在while循环中循环,没有任何变化,因此它将永远循环
恐怕语言障碍使我们很难提供如何实现这一点的细节,但至少我们可以理解为什么5
的输入会给您带来无限循环
此输出似乎适用于大于2
的任何数字。您可能需要调查从int到float的转换是如何影响您的数学的