C语言中类型溢出问题
题目:已知不等式 1!+2!+3!+…+m!‹n,请编程对用户指定的n值计算并输出满足该不等式的m的整数解。
输入:2000000000
输出:m<=12
错误示例:
int main(void)
{
int n,j,m;
int sum=0;
j=1;
scanf("%d",&n);
for(m=1;;m++)
{
j*=m;
sum+=j;
if(sum>=n)
break;
}
printf("m<=%d\n",m-1);
return 0;
}
输入之后结果为 28;(错误)
正确代码:
#include<stdio.h>
int main(void)
{
long int m,n;
double j,sum;
sum=0.0;
j=1.0;
scanf("%d",&n);
for(m=1;;m++)
{
j*=m;
sum+=j;
if(sum>=n)
break;
}
printf("m<=%d",m-1);
return 0;
}
输出结果为12;(正确)
错误原因:类型溢出问题
int 和long型数据在内存中占4个字节,数据的范围在-21亿~21亿,无法容纳所得结果。因此定义为double型提高精度。int可以表示9位及以下整数,准备上限为2147483647.
左侧为错误代码运行,右侧为正确代码:
j在循环执行之后应该为6227020800,但是整型的j只能储存9位数 左侧的结int储存数据过大,导致结果错误。
double占8个字节(64位)存空间,最多可提供16位有效数字,小数点后默认保留6位。如全是整数,最多提供15位有效数字。