1

我有一个家庭作业到期,我的循环有问题。我首先必须通过我已经可以做的循环找到下一个最高和最低的平方根。接下来我的作业告诉我,我需要通过平均整数的下一个最高和最低平方根来获得平方根的近似值。然后我必须询问用户他们想要的小数位数。以下是作业的引述:

然后应该构建一个计数控制的循环;它将为每个所需的小数位执行一次;在示例中,此循环将执行四次(十位、百位、千位和千位小数位各执行一次)。使用诸如decimalPosition 之类的计数器来跟踪循环处于哪个阶段。

这是我遇到麻烦的地方,我正在使用基于用户输入的小数位数的 while 循环,但我的循环没有完成循环。我是编程新手,所以如果这真的很简单,请原谅我。这是我的while代码:

for (int decimalPosition = 1; decimalPosition <= decimal; decimalPosition++)
{
    while (baseRoot*baseRoot > num)
    {
        baseRoot = baseRoot - (pow((.1),decimalPosition));
        cout << fixed << setprecision(decimal) << baseRoot << endl;
    }

}

这是我到目前为止的输出

Enter a number you wish to know the square root of: 8
Enter the number of decimal places of accuracy you want: 7
Find the square root of 8 to 7 decimal places: 
2.6000000
2.7000000
2.8000000
2.9000000
2.9000000 square root of 8.0000000
4

2 回答 2

4

它被称为牛顿法,它的收敛性是二次的。那应该可以帮助您弄清楚。

PS - 巴比伦人首先发现了它,但牛顿得到了它的赞誉。

于 2012-09-19T01:01:00.387 回答
0

为了使您的循环正常工作,您可以添加一个语句

baseRoot = baseRoot + (pow((.1),decimalPosition));

在while循环之后,因为您需要确保baseRoot大于每次迭代之前的答案。像这样:

for (int decimalPosition = 1; decimalPosition <= decimal; decimalPosition++)
{
    while (baseRoot*baseRoot > num)
    {
        baseRoot = baseRoot - (pow((.1),decimalPosition));
        cout << fixed << setprecision(decimal) << baseRoot << endl;
    }
    baseRoot = baseRoot + (pow((.1),decimalPosition));
}

现在你可以得到答案了2.8284271

顺便说一句,还有另一种称为二分法(类似于二分搜索)的有效方法来解决这类问题(与单调函数有关),无需太多数学:

double mySqrt(double x, double epsilon) {
    double left = 0, right = x;
    while (right - left > epsilon) {
        double mid = (left + right) / 2;
        if (mid * mid > x) {
            right = mid;
        } else {
            left = mid;
        }
    }
    return left;
}

这很简单,愚蠢:)

于 2012-09-20T05:55:31.983 回答