看一下这个C语言程序怎么老出错!

来源:百度知道 编辑:UC知道 时间:2024/04/30 00:05:05
#include<stdio.h>
main()
{ unsingned long a,l,n,t;
int i,j,u;
int m[5];
for(i=10;i<254;i++)
{ a=i*i;
l=a;
u=n=0;
t=1;
while(a!=0)
{ m[u]=a%10;
a/=10;
u++;
}
u--;
for(j=u;j>=0;j--)
{ n+=m[j]*t;
t*=10;
}
if(l==n)
printf("%d %d\n",i,l);
}
}

这个题如果把那个unsigned去下来就行了,如果不出就会出现
TC
NTVDM CPU 遇到无效的指令
CS:ffff IP:0084 0P:f0 97 26 c4 7f 选择“关闭”终止应用程序。

不知道这是什么原因,
还有如果把那个unsigned去下来,把下面的那个int 改成long型就会出现结果等于0不知道这二种情况是什么原因!
还有如果是单步执行不会出现错误

经过调试还是找到问题了:
众所周知,TC里的int型的数据域是-32768~32767,long型的数据域是-65536~65535。
那么,当i=182时,i*i就是33124,当int*int时其计算的中间结果是做为一个int型来保存的,就是这个数直接造成了数据溢出,这样的话TC报什么错都有可能。单步调试到i=182就可以看到a的值出现激增。

这个在long前面的unsigned,其实要不要都没关系。你只要把int改成long就可以解决溢出的问题。

再来说一下“结果等于0”的现象,其实很简单,你在输出时用的是"%d %d",面i和l是两个long型的数,所以就出现“结果等于0”了,你改成
printf("%ld %ld\n",i,l);
就行了。下面是我调试好的。
#include<stdio.h>
main()
{
unsigned long a,l,n,t;
long i,j,u;
int m[5];
for(i=10;i<254;i++)
{
a=i*i;
l=a;
u=n=0;
t=1;
while(a!=0)
{
m[u]=a%10;
a/=10;
u++;
}
u--;
for(j=u;j>=0;j--)
{
n+=m[j]*t;
t*=10;
}
if(l==n)
printf("%ld %ld\n",i,l);
}
}

unsingned
->unsigned
拼写错误

在我机子上很正常啊,除了你把unsigned写错了以外,编译,运行都没问题.
我用的是VC6

好象是你说的那么回事,不知道原因。

1.把i声明为unsigned int,j和u仍然为int就可以了
2.printf(&qu