为何while循环中的求和计算结果始终为0?技术求助
求和结果始终为0的原因及解决方法
问题描述
我正在编写一段实现特定公式求和的代码,但求和结果始终为0,想了解导致无法正常累加的原因。我怀疑问题可能出在int和double类型变量的声明上。当我实现简单的自然数求和时代码可以正常运行,但如下的复杂公式求和却无法得到正确结果。
代码:
#include <stdio.h> int main() { int i, n; double sum = 0; printf("Enter the max value for the sum: "); scanf("%d", &n); i = 1; while(i <= n) { sum = sum + (1 / ((1 + i) * (1 + i))); i++; } printf("Sum = %f\n", sum); }我运行了上述代码,期望得到正确的求和结果,但输出却始终为0.0000。
问题根源
问题出在整数除法的截断特性上:表达式1 / ((1 + i) * (1 + i))里的所有操作数都是整数类型——1是int,i是int,计算出来的分母也是int。当i≥1时,分母最小是(1+1)*(1+1)=4,此时1除以4在整数除法中会直接截断小数部分,结果为0。循环里每一次累加的都是0,最终sum自然一直是0。
你之前的自然数求和能正常运行,是因为累加项本身是整数,不存在除法截断的问题。
解决方法
只需要让除法运算变成浮点数除法就行,有两种简单的修改方式:
- 把分子
1改成1.0(double类型),强制触发浮点数计算:sum = sum + (1.0 / ((1 + i) * (1 + i))); - 或者对分母做强制类型转换,转成double:
sum = sum + (1 / (double)((1 + i) * (1 + i)));
修正后的完整代码
#include <stdio.h> int main() { int i, n; double sum = 0; printf("Enter the max value for the sum: "); scanf("%d", &n); i = 1; while(i <= n) { sum = sum + (1.0 / ((1 + i) * (1 + i))); i++; } printf("Sum = %f\n", sum); }
内容的提问来源于stack exchange,提问作者BeansAndRice
相关产品推荐
相关产品推荐

