【问题标题】:I created an algorithm that return the square root. Why it is not working?我创建了一个返回平方根的算法。为什么它不工作?
【发布时间】:2021-12-03 23:42:59
【问题描述】:

我的代码可以正常工作。我做了一个算法,它需要一个数字,发现这个数字的平方根的底和屋顶(例如,如果我想发现 5 的平方根,那么底是 2,屋顶是 5。那表示 5 的平方根在这些数字之间。但是当我输入 5 或 5 之类的数字时,我的代码会进入循环。为什么?

    int raiz_inteira(int valor)
    {
    int impar = 1, cont = 0;
    while(valor >= impar)
    {
       valor = valor - impar;
       cont ++;
       impar+=2;
    }
    return cont;
    }


float raiz_exata(float valor, int base, int teto)
{
    float media = (base+teto)/2.0;
    float erro = media*media-valor;
    printf("%f\n",media);
    if(erro < 0)
    {
        erro *=-1;
    }
    else if(erro == 0)
    {
        return media;
    }
   
    while(erro >0.1)
    {
        printf("%f",media);
        if(media*media >valor)
        {
            teto = media;
        }
        else
        {
            base = media;
        }
        media = (base+teto)/2.0;
        erro = media*media-valor;
        if(erro < 0)
        {
            erro *=-1;
        }
    }
}

void main()
{
    int teto, base, raiz;
    printf("Type a number:\n");
    scanf("%d",&raiz);
    base = raiz_inteira(raiz);
    teto = base+1;
    raiz_exata(raiz,base,teto);
}

【问题讨论】:

  • 遵循逻辑。当你输入 5 时你的程序会发生什么?
  • 如果你把代码翻译成英文会更容易。我不知道 raiz_exata、teto 或 media 应该是什么意思。
  • “当我输入 5 或 5 之类的数字时” - 5 和 5 有什么区别?
  • @klutt 很可能 teto 是头部或上限,base 是最小界限,media 是平均值或平均值。

标签: c square-root


【解决方案1】:

您的代码,已清理以便于阅读:

#include <stdio.h>

int raiz_inteira(int valor) {
    int impar = 1, cont = 0;

    while (valor >= impar) {
        valor -= impar;
        cont++;
        impar += 2;
    }

    return cont;
}

float raiz_exata(float valor, int base, int teto) {
    float media = (base + teto) / 2.0;
    float erro = media * media - valor;

    printf("%f\n", media);

    if (erro < 0) {
        erro *= -1;
    }
    else if (erro == 0) {
        return media;
    }

    while (erro > 0.1) {
        printf("%f", media);

        if (media * media > valor) {
            teto = media;
        }
        else {
            base = media;
        }

        media = (base + teto) / 2.0;
        erro = media * media - valor;

        if (erro < 0) {
            erro *= -1;
        }
    }
}

void main() {
    int teto, base, raiz;
    printf("Type a number:\n");
    scanf("%d", &raiz);
    base = raiz_inteira(raiz);

    // printf("base: %d\n", base);

    teto = base + 1;

    // printf("teto: %d\n", teto);

    raiz_exata(raiz, base, teto);
}

现在,让我们运行它,输入 5。

当我们开始时,raiz 是 5,baseraiz_inteira(5),其计算结果为 2teto3

所以我们输入raize_exataraiz_exata(5.0, 2, 3)

在这个函数内部,media2.5erro2.5 * 2.5 - 5.0 等于 1.25请记住,浮点数并不总是精确值。

2.5 值被打印出来。

1.25 既不小于0,也不等于0,因此跳过了条件。

进入while循环,我们再次打印2.5。因为2.5 * 2.5 大于5.0 teto 设置为2,因为tetoint

然后我们将media 更新为base + teto / 2.0,这又是2.5,因此没有改变。因为那里没有变化,所以error 没有变化。因为不小于0,所以跳过条件。

在while循环中下一个循环,没有任何改变,所以它永远循环。

我担心语言障碍使我们难以提供有关如何进行这项工作的详细信息,但至少我们可以看到为什么输入 5 会给您带来无限循环。

这个输出似乎发生在任何大于2 的数字上。您可能想要调查从整数到浮点数的转换如何影响您的数学。

【讨论】:

  • 谢谢。问题是我使用的是 int 而不是 float。当我改变它时,它起作用了。 Teto 和 base 是我平方根的屋顶和底部。我来自巴西,所以我的代码的某些部分是葡萄牙语的,我忘了更改。谢谢。
猜你喜欢
  • 2022-11-20
  • 1970-01-01
  • 2013-12-27
  • 2010-10-16
  • 1970-01-01
  • 2021-12-26
  • 2021-10-13
  • 1970-01-01
  • 2014-02-05
相关资源
最近更新 更多