C语言 凑算式 控制精度问题

C语言 码拜 8年前 (2017-05-06) 2086次浏览
想问一下,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。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言 凑算式 控制精度问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)