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

C语言程序未输出预期结果,求助实现指定计算公式

问题排查与修正方案

核心问题分析

  • 全局变量未初始化直接使用:main函数中循环判断j<=n时,n是未初始化的全局变量,值为随机垃圾值(大概率为0),导致循环根本不执行,直接输出空页面。
  • 阶乘函数设计逻辑混乱:
    • faktoriyel函数的参数fak被直接赋值为1,完全没有利用传入的参数;
    • 每次调用faktoriyel都会要求用户输入n,这会导致循环中反复输入,完全不符合公式计算的逻辑(应该只输入一次n)。
  • 公式计算优先级错误:表达式n-j/faktoriyel(j)中,除法优先级高于减法,会先计算j/faktoriyel(j),再用n减去这个结果,这和常规的(n-j)/j!计算逻辑不符。
  • 输出逻辑失效:原代码依赖循环内输出,但循环未执行时自然无任何输出。

修正后的代码

#include <stdio.h>
#include <math.h>

// 专注计算阶乘的函数,传入数值返回对应阶乘
long long faktoriyel(int sayi) {
    long long sonuc = 1;
    for (int i = 1; i <= sayi; i++) {
        sonuc *= i;
    }
    return sonuc;
}

int main() {
    int n;
    double toplam = 0.0; // 用浮点类型保存总和,避免整数除法丢失精度

    // 仅输入一次n,符合计算流程
    printf("n degerini giriniz : ");
    scanf("%d", &n);

    // 遍历计算每一项并累加
    for (int j = 1; j <= n; j++) {
        long long j_fak = faktoriyel(j);
        // 按公式计算单一项:j + (n-j)/j!
        double terim = j + (double)(n - j) / j_fak;
        toplam += terim;
        // 可选:输出中间过程,方便验证
        printf("j=%d时,当前项值:%.4f,累计总和:%.4f\n", j, terim, toplam);
    }

    // 输出最终结果
    printf("\n最终总和为:%.4f\n", toplam);
    return 0;
}

修正说明

  • 移除冗余全局变量:将i、n、j改为局部变量,彻底避免全局变量未初始化的问题。
  • 重构阶乘函数:让faktoriyel仅负责阶乘计算,不再处理输入;用long long类型降低阶乘溢出的概率。
  • 修正公式计算:明确(n-j)作为被除数,转换为double类型执行浮点除法,保留计算精度。
  • 优化输入输出:仅在程序开头输入一次n,清晰展示中间计算过程与最终结果。

内容的提问来源于stack exchange,提问作者user12552069

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:25:38