你发的这段程序,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使用浮点数前先初始化过浮点数
这样就可以了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)