C++实现巴比伦平方根算法输出与示例不符问题排查
问题排查与优化建议
输出不匹配的核心原因
- 初始猜测值计算错误
你当前写的guess = input / 2中,input是int类型,会先执行整数除法(截断小数部分),151/2得到的是75而非正确的75.5,直接导致第一次迭代的猜测值就和示例存在偏差。修正方案为改为浮点数除法:guess = static_cast<double>(input) / 2;,修正后第一次迭代得到的guess就是示例中的38.75。 - 循环终止条件不符合要求
题目要求精度到0.001即可停止迭代,但你用了guess != test作为终止条件,会一直迭代到浮点数精度极限才停止,不仅多了不必要的迭代次数,最终结果也会比示例要求的更精确,导致输出不一致。需要把终止条件改为两次猜测值的差的绝对值小于0.001:while (fabs(guess - test) > 1e-3);,注意要引入<cmath>头文件使用fabs函数。 - 输出提示文本与示例不一致
你的提示文本换行规则、输出内容(比如你输出的是You input,示例是You entered)、末尾标点都和示例有差异,也会导致整体输出不匹配。
其他代码问题
- 头文件缺失:后续用到浮点数绝对值函数
fabs需要引入<cmath>头文件 - 命名空间使用混乱:你已经声明了
using namespace std;,但输出时又写了std::cout,统一风格即可 - 没有做输入合法性校验:如果用户输入负数、0,当前代码会出现死循环或者输出错误结果,建议增加输入校验逻辑,输入非正数时提示用户重新输入
- 变量声明不合理:不需要提前声明所有变量,比如
r、test这类仅在循环内使用的变量,可以放在循环内部声明,提升代码可读性
do while循环优化点
- 替换浮点数全等判断:浮点数因为精度误差,全等判断非常容易出现不可预期的问题,用精度阈值判断的方式更安全,也更符合业务需求
- 局部化循环内变量:把
r、test的声明移到循环内部,减少全局作用域的变量污染 - 提取精度阈值为常量:把0.001提取为const常量,比如
const double EPS = 1e-3;,后续修改精度时只需要改常量值即可,维护更方便
修正后核心代码片段
// 引入缺失的头文件 #include <cmath> int main() { std::cout << std::fixed << std::setprecision(4); // 精度常量定义 const double EPS = 1e-3; int input; // 提示文本调整为和示例一致,此处省略调整步骤 cin >> input; double guess = static_cast<double>(input) / 2; do { double test = guess; double r = input / guess; guess = (guess + r) / 2; cout << "\nguessing " << guess; } while (fabs(guess - test) > EPS); // 替换为精度判断 // 后续输出逻辑调整为和示例一致,此处省略调整步骤 }
内容的提问来源于stack exchange,提问作者user11495912
相关产品推荐
相关产品推荐

