乔宽 发表于 2019-9-26 17:13:36

C++程序

本帖最后由 乔宽 于 2019-9-26 17:22 编辑

/*
12.用于计算数字n的平方根的巴比伦算法如下:
    1) 先猜一个答案guess(可以将n/2作为第一个答案)
    2)计算r = n/guess
    3)令guess= (guess + r)/ 2
    4)如有必要返回第2步重复多次。 步骤2和步骤3的重复次数越多,guess就越接近n的平方根。
   写一个程序,输入整数作为n的值,重复执行巴比伦算法,直到guess与前一个guess的误差在1%范围内,将答案作为一个double输出
*/
#include <iostream>

using namespace std;

int main()
{
    char is_continue;//判断程序是否继续运行
    double n;
    double answer1;
    double answer2;
    double guess;
    double r;
    int count = 0;
    do
    {
      cout << "输入要计算平方根的数:" << endl;
      cin >> n;
      guess = n/2;

    do
    {
         answer1 = guess;
      r = n/guess;
      guess = (guess + r)/2;
      answer2 = guess;
      count++;
    }while((answer1 - answer2) > ( 0.01*answer1 ));

    cout << n << "平方根是" << guess << endl;
    cout << "总共循环了多少" << count << "次" << endl;
    cout << "继续吗(输入Y继续,输入其它字符退出) " << endl;
    cin >> is_continue;
    }while(is_continue == 'y'|| is_continue == 'Y');
    return 0;
}
题上不是说直到guess与前一个guess的误差在1%范围内吗?那为什么是while((answer1 - answer2) > (answer1 * 0.01));而不是<。而且用 > 计算了一下答案也不对,并且<也运行不了。

jackz007 发表于 2019-9-26 17:26:55

本帖最后由 jackz007 于 2019-9-26 17:29 编辑

while ((answer1 - answer2) > (answer1 * 0.01)) ;
      这句的逻辑是说,如果 (answer1 - answer2) > (answer1 * 0.01) 为 true,那就继续循环,而到了结束循环的时候,自然就是这个条件不成立的时候,也就是说,是满足 (answer1 - answer2) <= (answer1 * 0.01) 条件的时候。

superbe 发表于 2019-9-26 17:31:23

本帖最后由 superbe 于 2019-9-29 13:17 编辑

do while是先执行循环,然后判断如果条件成立继续循环,如果不成立则结束。求平方根的算法是只要误差比规定的大,就继续循环,所以应该用>啊。
把这行加个fabs取绝对值就正确了while(fabs(answer2 - answer1) > (answer1 * 0.01));



{:5_92:} ,提交上去才发现大神已经回答过了。

心驰神往 发表于 2020-11-3 15:56:10

{:10_243:}
页: [1]
查看完整版本: C++程序