为什么C语言统计小于给定r的序列项数代码仅r<1正常r=1无输出
问题原因
- 你使用的迭代公式生成的序列为单调递增序列,数学上可推导其极限为1,因此序列的所有项都严格小于1,永远无法达到或超过1。当输入r=1时,
while (nextTerm < r)的循环判断条件永远成立,程序陷入死循环,无法执行到后续的打印语句,因此没有输出。 - 额外补充:即使r略小于1,当序列迭代到float精度上限时,nextTerm的数值将不再更新,此时如果nextTerm仍然小于r,也会触发死循环。
修复方案
需要补充收敛判断逻辑,当序列数值不再变化(达到精度上限)时强制跳出循环,同时也可以提前对r≥1的场景做边界处理提升效率:
#include <stdio.h> #include <math.h> int main() { int nr = 2; float x1 = 0, x2 = 0, nextTerm = 0, r; const float EPS = 1e-7; // 匹配float精度,可按需调整 scanf("%f", &r); float lastTerm; while (nextTerm < r) { lastTerm = nextTerm; nextTerm = (1 + x2 + x1 * x1) / 3; // 新增收敛判断:数值不再更新时说明已趋近极限,无法继续增大,跳出循环 if (fabs(nextTerm - lastTerm) < EPS) { break; } x1 = x2; x2 = nextTerm; nr++; } printf("%d", nr); return 0; }
- 如果对性能有要求,可新增边界判断:当
r >= 1时直接输出预期的计数值,不需要进入循环,因为所有序列项都小于1,天然满足小于r的条件。 - 如果初始两个值0是否计入统计的规则有变动,可自行调整
nr的初始值和计数语句的位置。
内容的提问来源于stack exchange,提问作者my_name
相关产品推荐
相关产品推荐

