C语言分数求和计算器循环累加结果不符合预期问题求助
分数累加计算器的问题修正
需求与问题现象
我正在开发一款计算器,需求如下:
- 输入数字n后,计算
1/2+2/2 +1/3+2/3+3/3 +…+1/n+2/n+…+n/n的累计总和 - 针对每个分母输出一次当前的累计总和
- 输出完成后程序重启等待新输入,输入0可终止程序
但输入3时,实际输出为sum=1、sum=2,预期输出应为sum=1.5(即3/2)、sum=3.5(即7/2)。
初始错误代码
#include <stdio.h> int main(){ printf("Please enter the max denominator:\n"); int i,j,n; int sum=0; do{ scanf("%d",&n); for (j=2;j<=n;j++){ for(i=1;i<=j;i++){ sum+= i/j; if (i==j){ printf("sum=%d\n",sum); break; } } } } while (n!=0); return 0; }
问题根源分析
- 整数运算丢失精度:
sum被定义为int类型,且i/j是整数除法(两个整数相取整),比如1/2结果为0,2/2为1,累加后完全丢失小数部分。 - 累加器未重置:每次输入新的n时,
sum没有归零,会累计上一次的计算结果,导致输出错误。 - 输出逻辑冗余:将
printf放在内层循环的判断中,不仅逻辑多余,还容易引发输出时机错误。
修正后的完整代码
#include <stdio.h> int main(){ printf("请输入最大分母:\n"); int i,j,n; double sum=0.0; do{ scanf("%d",&n); sum=0.0; // 每次输入新n时重置累加器 for (j=2;j<=n;j++){ for(i=1;i<=j;i++){ sum += (double)i/j; // 强制转换为浮点数运算,保留精度 } printf("sum=%.2lf\n",sum); // 每个分母计算完成后输出累计总和 } } while (n!=0); return 0; }
关键修改说明
- 将
sum的类型从int改为double,支持小数累加,保证计算精度。 - 新增
sum=0.0重置逻辑,避免多次输入之间的结果干扰。 - 对
i进行(double)强制类型转换,让i/j变为浮点数除法,正确计算分数值。 - 调整
printf位置到分母循环结束后,贴合需求中"每个分母输出一次累计总和"的要求,同时移除冗余的break语句。 - 将提示文字改为中文,提升使用友好度。
内容的提问来源于stack exchange,提问作者annazxc
相关产品推荐
相关产品推荐

