C语言中类型溢出问题 题目:已知不等式.......请编程对用户指定的n值计算并输出满足该不等式的m的整数解。

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位有效数字。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值