在C ++中获取平方根的Babylonian算法的无限循环

时间:2014-09-22 03:25:00

标签: c++ algorithm square-root

我已经在整个互联网上彻底搜索了这个主题,并且线程要么死了,要么使用与我书中描述的不同的方法。

例如,http://www.geeksforgeeks.org/square-root-of-a-perfect-square/。这对我来说不起作用,因为我的算法需要循环,直到达到最后一次"猜测"的前1%。

以下是案文中的问题。

  

用于计算数n的平方根的巴比伦算法如下:

     
      
  1. 猜测数字(您可以选择n / 2作为初始猜测)。
  2.   
  3. 计算r = n / guess
  4.   
  5. 设置猜测=(猜测+ r)/ 2
  6.   
  7. 根据需要返回步骤2进行尽可能多的迭代。步骤2和3重复得越多,猜测就越接近   平方根。
  8.         

    编写一个为n输入整数的程序,遍历   直到猜测的巴比伦算法在先前猜测的1%之内,   并将答案输出为双倍。

我写了以下代码:

#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int main()
{
int  n;
double r, guess(4), lastGuess;

cout << "Enter a number to find the square root of: ";
cin >> n;

do
{

    r = n / guess;
    lastGuess = guess;
    guess = ( guess + r ) / 2;

//  cout <<"Guess: " << guess << endl;
//  cout <<"Last Guess: " << lastGuess << endl;

    cout << "Guess : " << guess  << endl;
    cout << "Last Guess 1% = " << lastGuess + ( lastGuess * 0.01 ) << endl;
    cout << "r = " << r << endl;

} while( guess >= lastGuess * 0.01 );
cout << r;

return 0;
}

该程序计算r的正确答案,但尽管猜测大于1%添加到lastGuess,循环也不会终止。

当输入144为n时,该程序产生以下输出。

....
r = 12
Guess : 12
Last Guess 1% = 12.12
r = 12
Guess : 12
Last Guess 1% = 12.12
r = 12
Guess : 12
Last Guess 1% = 12.12
r = 12
Guess : 12
Last Guess 1% = 12.12
....

根(r)是正确的(12)。猜测比lastGuess(12 <12.12)少,它应该返回错误的条件,对吗?为什么循环没有结束?

3 个答案:

答案 0 :(得分:4)

如果你想加1%,你需要乘以1.01,而不是0.01。

while( guess >= lastGuess * 1.01 );

顺便说一句,这个迭代,而猜测增长超过1%。你应该允许相反,它可能缩减超过1%。近似可以从任一方向接近答案。 (它将从左边的右根和负根接近正根。)

答案 1 :(得分:3)

打印 lastGuess 时,您正在使用

 lastGuess + ( lastGuess * 0.01 )

但是在检查循环条件时你正在使用

lastGuess*0.01

因此,在循环条件中,使用与打印lastGuess值相同的等式。

答案 2 :(得分:0)

要正确退出循环,请使用类似的内容。

void f(int N)
{
    double x = N / 4;
    double prev = 0.0f;

    while(1)
    {
        x = 0.5 * (x + N / x);
        if (prev == x)
            break;

        prev = x;
        printf("val: %f\n", x);
    }

    printf("SQRT(%d) = %f\n", N, x);
}