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

C语言程序如何正确输出超过10位整数的乘积?

大整数乘积计算错误的解决方法

问题描述

求和功能正常,但计算乘积时,结果超过10位整数后,用int类型会得到错误结果,尝试float类型也无效。例如输入6,20,4,16,15,11,6,3,19,18时,预期输出乘积为7800883200,但当前程序输出72076004000。

当前代码如下:

#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[]){
    
    if(argc<2){
        printf("Invalid Input: filename value missing\n");
    }
    else{
        char filename[50]; 
        strcpy(filename,argv[1]);
        FILE* fptr = fopen(filename,"r");
        
        if(fptr==NULL){
            printf("File not found!\n");
        }
        else{
            
            int arr[10]; 
            int i; 
            int val; 
            for(i=0;i<10;i++){
                fscanf(fptr,"%d",&val); 
                arr[i] = val;
            }

          
            int sum = 0; 
            
            for(i=0;i<10;i++){
                
                sum= sum + arr[i];
            }

            
           int product = 1;
            for(i=0;i<10;i++){
                product= product * arr[i]; 
            }

            printf("Sum: %d\n",sum);
            printf("Product: %d\n",product);
            fclose(fptr);
        }
    }
    return 0;
}

错误原因

  • int类型溢出:普通int通常是32位有符号整数,最大值仅为2147483647,而预期结果7800883200远大于这个值,计算时会发生整数溢出,导致结果错乱。
  • float精度不足:float类型的有效数字只有6-7位,无法精确表示超过这个位数的整数,存储大整数时会丢失精度,所以结果也不对。

解决方案

使用C语言中支持更大范围的整数类型,比如long long(64位有符号整数),它的取值范围是-9223372036854775808到9223372036854775807,完全能容纳你的预期结果。

修改后的代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char* argv[]){
    
    if(argc<2){
        printf("Invalid Input: filename value missing\n");
    }
    else{
        char filename[50]; 
        strcpy(filename,argv[1]);
        FILE* fptr = fopen(filename,"r");
        
        if(fptr==NULL){
            printf("File not found!\n");
        }
        else{
            
            int arr[10]; 
            int i; 
            int val; 
            for(i=0;i<10;i++){
                fscanf(fptr,"%d",&val); 
                arr[i] = val;
            }

          
            int sum = 0; 
            
            for(i=0;i<10;i++){
                
                sum= sum + arr[i];
            }

            // 改为long long类型,初始值用1LL确保类型正确
           long long product = 1LL;
            for(i=0;i<10;i++){
                product= product * arr[i]; 
            }

            printf("Sum: %d\n",sum);
            // 使用%lld格式符输出long long类型
            printf("Product: %lld\n",product);
            fclose(fptr);
        }
    }
    return 0;
}

关键修改点

  1. 将乘积变量product的类型从int改为long long,避免溢出。
  2. 初始值设为1LL,确保是long long类型,防止计算过程中因类型不匹配导致的隐性溢出。
  3. 输出时使用%lld格式符,正确打印long long类型的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:00:16