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

计算偶数乘积的C语言代码运行结果始终为0问题咨询

问题成因
  • 核心原因为整型溢出:绝大多数系统中int为32位有符号整型,取值范围仅为 -2147483648 ~ 2147483647。50到2区间所有偶数的乘积数值远超该上限,溢出后触发C语言未定义行为,最终输出结果为0。
  • 附加非致命问题:void main()不属于C语言标准主函数写法,标准写法为int main(),执行结束后需返回整型返回值,部分编译器下该写法会触发编译警告。
解决方案
  • 方案1:若允许结果截断或乘积数值未超过64位整型上限,可将存储乘积的变量替换为64位long long类型,修改后代码如下:
#include<stdio.h>
int main(){
    int i;
    long long mul = 1;
    for(i = 50; i > 1; i--){
        if(i % 2 == 0){
            mul = mul * i;
        }
    }
    printf("\n Multiplication is %lld",mul);
    return 0;
}

注意:50到2所有偶数的乘积已超过64位long long的存储上限,本方案仅能解决小范围乘积计算的溢出问题,无法得到本次计算的精确结果。

  • 方案2:若需要获取完整精确的超大乘积结果,可通过数组模拟大数乘法实现,示例代码如下:
#include<stdio.h>
// 预留足够空间存储结果每一位
#define MAX_LEN 1000
int main() {
    int res[MAX_LEN] = {1}; // 初始乘积为1
    int len = 1; // 当前结果的位数
    // 从小到大遍历偶数计算,逻辑等价于从50到2遍历
    for (int i = 2; i <= 50; i += 2) {
        int carry = 0;
        // 逐位相乘处理进位
        for (int j = 0; j < len; j++) {
            int product = res[j] * i + carry;
            res[j] = product % 10;
            carry = product / 10;
        }
        // 处理剩余进位
        while (carry) {
            res[len++] = carry % 10;
            carry /= 10;
        }
    }
    printf("\n Multiplication is ");
    // 数组低位存储结果低位,需倒序输出
    for (int k = len - 1; k >= 0; k--) {
        printf("%d", res[k]);
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:27:04