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

C语言使用unsigned long long计算100阶乘返回0错误排查

问题原因
  • 代码存在类型不匹配错误:factorial函数返回值为unsigned long long int类型,但你在main函数中用long int类型变量a接收返回值,long int取值范围远小于unsigned long long int,会额外触发值截断;同时输出unsigned long long类型的正确格式符为%llu,你使用的%lld是用于输出有符号long long类型的格式符,会导致输出异常。
  • 核心问题是基础数据类型取值范围不足以承载大阶乘结果:64位无符号整型unsigned long long int的最大值为18446744073709551615(约1.8×1019),最多只能正确计算到20的阶乘,21的阶乘就已经超过该上限发生溢出。C语言中无符号整型溢出会自动执行模264运算,当阶乘计算过程中累积的2的因子数量达到64个时,模2^64的结果就会为0,100的阶乘包含远多于64个2的因子,因此最终返回结果为0。
解决方法
  • 如果你只需要计算20及以下的阶乘,修复代码中的类型不匹配问题即可:
#include <stdio.h>

unsigned long long int factorial(unsigned long long int n);

int main(void){
    unsigned long long int n;
    int t;
    scanf("%d", &t);
    for(int i = 0; i < t; i++){
        scanf("%llu", &n);
        unsigned long long int a = factorial(n);
        printf("%llu\n", a);
    }
}

unsigned long long int factorial(unsigned long long int n){
    if(n == 0){
        return 1;
    }
    else{
        return (n * factorial(n - 1));
    }
}
  • 如果你需要计算100甚至更大的阶乘,需要自行实现大整数运算,用数组存储阶乘结果的每一位,模拟手动乘法的逻辑逐位计算、处理进位,示例实现如下:
#include <stdio.h>
// 100!共有158位,预留200位空间足够使用
#define MAX_LEN 200

void factorial(int n) {
    int res[MAX_LEN] = {0};
    res[0] = 1;
    int res_len = 1;
    
    for (int i = 2; i <= n; i++) {
        int carry = 0;
        for (int j = 0; j < res_len; j++) {
            int product = res[j] * i + carry;
            res[j] = product % 10;
            carry = product / 10;
        }
        while (carry) {
            res[res_len] = carry % 10;
            carry /= 10;
            res_len++;
        }
    }
    // 数组低位存的是结果的最后一位,倒序输出得到正确顺序
    for (int k = res_len - 1; k >= 0; k--) {
        printf("%d", res[k]);
    }
    printf("\n");
}

int main(void) {
    int t, n;
    scanf("%d", &t);
    for(int i = 0; i < t; i++) {
        scanf("%d", &n);
        factorial(n);
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:45:02