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

如何修复数字求和C代码中除法变量引发的运行时错误?

修复计算5位整数各位数字之和的C语言SIGFPE错误

错误原因分析

你的代码触发SIGFPE算术异常的核心原因有两个:

  1. 输入值更新逻辑错误:原代码中input-=(input - (division * digitDivisor));等价于input = division * digitDivisor,这会导致input无法逐步剥离高位数字(比如输入12345时,处理后input会变成10000而非2345),循环无法正常终止。
  2. 循环未限制除数边界:随着循环执行,digitDivisor不断被除以10,最终会变为0,此时执行division = input/digitDivisor就会触发除以0的算术异常。

修复方案

方案1:用for循环固定执行5次(适合明确5位整数的场景)

直接循环5次处理每一位,从根源避免除数变为0的问题,同时修正输入值的更新逻辑:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {

    int n, input, total, digitDivisor, division;
    scanf("%d", &n);
    total = 0;
    digitDivisor = 10000;
    input = n;

    // 固定循环5次,处理5位整数的每一位
    for(int i = 0; i < 5; i++){
        division = input / digitDivisor;
        total += division;
        input = input % digitDivisor; // 正确剥离当前最高位,保留剩余低位
        digitDivisor /= 10;
    }

    printf("%d", total);
    return 0;
}

方案2:调整while循环条件(兼容非5位整数输入)

将循环条件改为判断digitDivisor > 0,确保除数不会变为0,同时修正输入值更新逻辑:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {

    int n, input, total, digitDivisor, division;
    scanf("%d", &n);
    total = 0;
    digitDivisor = 10000;
    input = n;

    // 当除数大于0时循环,避免除以0
    while(digitDivisor > 0){
        division = input / digitDivisor;
        total += division;
        input = input % digitDivisor; // 正确剥离当前最高位
        digitDivisor /= 10;
    }

    printf("%d", total);
    return 0;
}

关键修复点说明

  • 替换错误的input更新语句:用input = input % digitDivisor可以正确剥离当前处理的最高位,让input逐步缩小为剩余的低位数字。
  • 限制循环边界:无论是固定循环次数还是判断除数是否大于0,都能避免digitDivisor变为0,从而杜绝除以0的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:15:42