我已经在整个互联网上彻底搜索了这个主题,并且线程要么死了,要么使用与我书中描述的不同的方法。
例如,http://www.geeksforgeeks.org/square-root-of-a-perfect-square/。这对我来说不起作用,因为我的算法需要循环,直到达到最后一次"猜测"的前1%。
以下是案文中的问题。
用于计算数n的平方根的巴比伦算法如下:
- 猜测数字(您可以选择n / 2作为初始猜测)。
- 计算r = n / guess
- 设置猜测=(猜测+ r)/ 2
- 根据需要返回步骤2进行尽可能多的迭代。步骤2和3重复得越多,猜测就越接近 平方根。
醇>编写一个为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)少,它应该返回错误的条件,对吗?为什么循环没有结束?
答案 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);
}