c语言编程比大小溢出数据,C语言编程问题,数据溢出。

C语言编程问题,数据溢出。

答案:3  信息版本:手机版

解决时间 2019-10-06 21:01

已解决

2019-10-06 03:48

#include int main()

{

int a,n,i=1,k,l,m,p;

long j=1;

scanf("%d %d",&a,&n);

while (i<=n)

{

j*=a;

i++;

}

k=j%1000/100;

l=j%100/10;

m=j%10;

p=k*100+l*10+m;

printf("The last 3 numbers is %d.\n",p);

}

这个运行以后输入100 10回车以后为什么结果是960了 ,应该是000啊

最佳答案

2019-10-06 04:54

一楼的方法可行,用的是高精度整数的方法。

但是但是。。。这题明显考的是数论中的【同余】的知识哦!

计算1000^10 % 1000 ,

1)可以先把 1000 的 10 次方计算出来,再和 1000 求余。很明显,这样【计算的中间结果】会【超出 int 的表示范围】,这样就需要用到【高精度整数】。

2)也可以一边【计算 1000 的 10次方】【一边和1000 求余】,这样的结果和(1)是相同的。

但是很明显,这样【计算的中间结果】【不会超出 int 的表示范围】,最大的【计算的中间结果】一定是【小于余数】的,也就是小于 1000 的,不需要【高精度整数】。

即:

1000^10 % 1000

= 1000 * 1000 * ... * 1000 % 1000 (方法1)

= 1000 % 1000 * 1000 % 1000 * 1000 % 1000 ... *1000 % 1000(方法2)

#include

int main()

{

int a,n,i=1,k,l,m,p;

long j=1;

scanf("%d %d",&a,&n);

while (i<=n)

{

// 方法1

//j*=a;

// 方法2

j=(j*a)%1000;

i++;

}

k=j%1000/100;

l=j%100/10;

m=j%10;

p=k*100+l*10+m;

printf("The last 3 numbers is %d.\n",p);

}

全部回答

1楼

2019-10-06 07:33

在c语言中,数据的存储就像一个圆圈,正数溢出数据就会从最小负数开始,负数溢出数据同理,打个比方(简略写一下):

int a=32768,b=-32769;

printf("a=%d,b=%d",&a,&b);

则会输出a=-32768,b=32767;

这样则50000输出就是(50000-32767)+(-32768)+(-1)=-15536

2楼

2019-10-06 06:25

你的算法有问题:

你这个程序的算法没有你想的这么容易,因为实际上中间你是在做幂运算,而幂运算是非常容易溢出的;

但是考虑到实际上你只是需要输出后面三位数字即可,那么按照乘法(幂运算其实是乘法运算)的规则,我们知道其实影响最后三位的是两个乘数的后三位,高于后三位的是不参与对乘积的后三位的影响的{(1000*x1+y1)*(1000*x1+y1),分析一下就知道了}。

所以,基于以上分析,我们只要将每一次乘积的后三位拿出来进行运算即可。

即你的进行幂运算的这段代码要改(未调试):

while (i<=n)

{

j*=a;

j=%1000;

i++;

}

如果还怕出现溢出,先将a也取余数就可以了。

我要举报

如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

大家都在看

推荐资讯

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值