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; }
关键修改点
- 将乘积变量
product的类型从int改为long long,避免溢出。 - 初始值设为
1LL,确保是long long类型,防止计算过程中因类型不匹配导致的隐性溢出。 - 输出时使用
%lld格式符,正确打印long long类型的值。
内容的提问来源于stack exchange,提问作者user19980968
相关产品推荐
相关产品推荐

