凑算式

凑算式

     B      DEF
A + --- + ------- = 10
     C      GHI


这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。


看到这种题第一个想法就是暴力破解,但是深挖一下,发现用到的是我平时很少接触到的回溯法,之前解八皇后问题时用过,但是当时做完思路也不是很清晰,今晚翻出来看看,再参考一下别人的做法。做出了这一题。

理清一下思路:

1.DEF和GHI是一个数,而不是相乘的。并且要考虑相乘之后精度的问题。

2.保证每一个数只出现一次


class HuiSu{
	static boolean []status = new boolean[10];//判断1~9这几个数值有没有被用了,初始值是false;
	static int []store = new int[10];//存放数字1~9。为了计算方便,从角标1开始,到角标9结束。就创建一个大小为10的数组。
	static int count = 0;
	public static void main(String []args){
		backTrack(1);
		System.out.println(count);
	}

	public static void backTrack(int num){//num的值就是对应ABCDEFGHI的位置嘛,num=1时就是代表A位置,num=2代表B位置,以此类推
		if( num == 10)//当到num==10时,说明到达最后了,每一个数都用上了,可以进行凑算式判断了
			if(check())
				count++;
		for(int i=1;i<=9;i++){//从1开始循环赋值,下面会判断此数有没有用过。
			if(status[i] == false){
				status[i] = true;//当进入这里后,这个值的状态要改变。后面还要继续循环赋值要判断状态的。
				store[num] = i;//这个位置赋值。
				backTrack(num+1);//进入下一个位置继续进行上面的操作
				status[i] = false;//用完之后,恢复成初始值。
			}
		}
	}

	public static boolean check(){
		double temp1 = store[1];
		double temp2 = store[2] * 1.00 /store[3];
		double temp3 = (store[4]*100 + store[5]*10 + store[6]) * 1.00 / (store[7]*100 + store[8]*10 +store[9]); 
		if(temp1+temp2+temp3 == 10)
			return true;
		return false;
	}
}

if(temp1+temp2+temp3 == 10)
			return true;

一开始我写这两句没什么的,后来回头检查发现有点不舒服。temp1+temp2+temp3的和是double型,而10是int型,可以比较吗?但是代码跑起来没问题,网上查了一下,发现其实会自动类型升级(type promotion),也就是10会升级为double型再比较。OK,虽说这道题没有多少回溯的味道,真正想体现一下回溯法的可以做一下八皇后问题,到此全部搞定。

具体想了解关于类型升级的和double类型的比较的,可以去下面两篇文章看看

https://blog.csdn.net/wcxiaoych/article/details/42806313

https://www.jianshu.com/p/6104ae66da6d


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值