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

2024-11-28 04:34:07
推荐回答(3个)
回答(1):

你的算法有问题:
你这个程序的算法段雀没有你想的这么容易,因为实际上中间你是在做幂运算,而幂运算是非常容易溢出的;
但是考虑到实际上你只是需要输出后面三位数字即可,那么按照乘法(幂运算其实是乘法运算)的规则,我们知道其实影响最后三位的是两个乘数的后三位,高于后三位的是不参与对乘积的后三位的影响的{(1000*x1+y1)*(1000*x1+y1),分析一下就知道了}。
所以,基于以上分析,我们只要将每一次乘积的后三位拿握好早出来进行运算即可。
即你的进行幂运算的这段代码要改(未调试):
while (i<=n)
{
j*=a;
j=%1000;
i++;
}

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

回答(2):

一楼的方法可行,用的是高精度整数的方法。
但是但是。。。这题明显考的是数论中的【同余】的知识哦!
计算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);
}

回答(3):

100的10次方是不能存放在long型的j里面的,
所以显示肯定会出错,会溢出!