一段特别诡异的C语言代码 求大神告知

一段特别诡异的C语言代码 求大神告知,第1张

你发的这段程序,int flag放到你标记的两个位置都是一样的。但是我觉得应该放到下面的这个位置更合理:

#define A(X) ((t[X]-'0'做禅))

int main()

{

int i,j,N,m

char t[3]

// int flag=0

scanf("%d",&m)

for(j=1j<=mj++)

{

int flag=0//应该放到这里来!!!!

scanf("%d",&N)

printf("Case %d:\n",j)

for(i=100i<1000i++)

{

sprintf(t,"%d",i)

if((A(0)+A(1))*2+A(2)==N)

{

printf("%c%c%c%c%c\n",t[0],t[1],t[2],t[1],t[0])

flag++

}

}

for(i=100i<1000i++)

{

sprintf(t,"%d",i)

if((A(0)+A(1)+A(2))*2==N)

{

printf("%c%c%c%c%c%c\n",t[0],t[1],t[2],t[2],t[1],t[0])

flag++

}

}

if(flag==0)printf("-1\n")

}

}

还可以优化为以下程序:

#define A(X) ((t[X]-'0'))

int main()

{

int 纯神尘i,j,N,m,flag

char t[3]

scanf("%d",&m)

for(j=1j<瞎橘=mj++)

{

printf("Case %d:\n",j)

flag=0

scanf("%d",&N)

for(i=100i<1000i++)

{

sprintf(t,"%d",i)

if((A(0)+A(1))*2+A(2)==N||(A(0)+A(1)+A(2))*2==N)

{

printf("%c%c%c",t[0],t[1],t[2])

if((A(0)+A(1)+A(2))*2==N)printf("%c",t[2])

printf("%c%c\n",t[1],t[0])

flag++

}

}

if(flag==0)printf("-1\n")

}

}

double:

1bit(符号位)

11bits(指数位)

52bits(中老尾数位) double的精度是由尾数的位数来决定的,

double:2^52 = 4503599627370496,一共16位。

re:我也想到了可能有精度有关系,那要怎么解决呢?因为必须需要double型相减呀!而且,用结果与0相比,这样的问题怎么办呀?

如果必须保留全部的尾数(精度无损),就不能直接衫培丛相减,需要一定算法解决。

比如,用两个(或或樱以上)double型数据,分别表示-10^20 ~ -10^11和-10^10 ~ -10^0精度上的数据,然后交叉计算。

这是由于scanf命令的一个bug造成雹嫌悉,是VC程序的漏洞,你源乎可以在定义float变量时先初始化,可以者敏把程序改成float f=0

使得scanf使用浮点数前先初始化过浮点数

这样就可以了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12308363.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存