想问一下,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
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)
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。
CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言 凑算式 控制精度问题!