想问一下,if语句中为什么写上*1.0之后,输出的就是对的个数29,但把*1.0删掉后,输出的个数就远大于29了?
还想讨教一下各位高手,除了这种暴力求法,还有其他的比较好的方法吗?非常感谢
还想讨教一下各位高手,除了这种暴力求法,还有其他的比较好的方法吗?非常感谢
/* 凑算式 B DEF A + -- + -- = 10 C GHI (假如显示有问题,可以参见【图1.jpg】) 这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。 例如: 6+8/3+952/714 就是一种解法, 5+3/1+972/486 是另一种解法。 这个算式一共有多少种解法?*/ #include <stdio.h> int main(){ int b,c,d,e,f,g,h,i,j; int k = 0; for(b=1; b<=9; b++){ for(c=1; c<=9; c++){ if(b==c){ continue; } for(d=1; d<=9; d++){ if(d==c || d==b){ continue; } for(e=1; e<=9; e++){ if(e==b || e==c || e==d){ continue; } for(f=1; f<=9; f++){ if(f==b || f==c || f==d || f==e){ continue; } for(g=1; g<=9; g++){ if(g==b || g==c || g==d || g==e || g==f){ continue; } for(h=1; h<=9; h++){ if(h==b || h==c || h==d || h==e || h==f || h==g){ continue; } for(i=1; i<=9; i++){ if(i==b || i==c || i==d || i==e || i==f || i==g || i==h){ continue; } for(j=1; j<=9; j++){ if(j==b || j==c || j==d || j==e || j==f || j==g || j==h || j==i){ continue; } if(fabs(b*1.0 + c*1.0 / d + (e * 100 + f * 10 + g)*1.0 / (h * 100 + i * 10 + j) - 10.00) < 0.0000000001){ k++; printf("%d %d %d %d %d %d %d %d %d\n",b,c,d,e,f,g,h,i,j); } } } } } } } } } } printf("%d",k); return 0; }
解决方案
40
乘以1.0的作用是将其转换为double形,你删掉1.0对每个数使用强制类型转换也可以。5*1.0你可以写成(double)5。原因,1/2按整形计算结果为0,4/3按整形结果为1,所以这样和你算得会不一致,1*1.0/2原因是1.0的存在,该算式中的其他数字被强制类型转换为double,最后结果为0.5。