You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:25:18