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<=%dn",m-1); return 0; }
输入之后结果为 28;(错误)
正确代码:
#includeint 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位有效数字。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)