【蓝桥杯】【马虎的算式】

题目
小明是一个急性子,上小学的时候经常把老师写在黑板上的题目抄错。
有一次,老师出得题目是:36495=? 他却给抄成了:39645=?
但结果却很戏剧性,他的答案竟然是对的!!
因为36495=39645=17820
类似这样的巧合情况可能还有很多,
比如:27594=29754
假设a b c d e代表1-9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如:abcde=adbce这样的算式一共有多少种呢?

分析
构造5个元素的数组,从9个数字的数组中取数字,找出所有的可能性。
注意递归和回溯。

源码

	private static HashSet<String> sets;
	
	public static void main(String[] args) {
		sets = new HashSet<String>();
		int[] a = new int[5];
		int[] b = new int[9];

		for (int i = 0; i < b.length; i++) {
			b[i] = i + 1;
		}
		
		f(a, b, 0);
		
		System.out.println(sets.size());
	}

	private static void f(int[] a, int[] b, int index) {

		if (index == a.length) {
			// 已经取出完毕
			yz(a);
			return;
		}

		for (int i = 0; i < b.length; i++) {
			{
				if (b[i] == -1) {
					// 如果前面已经取走了,换一个数字来取
					continue;
				}

				a[index] = b[i]; // 取数
				b[i] = -1;// 置为-1,表示已经取走了

			}

			f(a, b, index + 1);

			{
				// 回溯
				b[i] = a[index];
			}
		}

	}

	// ab*cde=adb*ce 
	//左边(a[0] * 10 + a[1]) * (a[2] * 100 + a[3] * 10 + a[4])
	//右边(a[0] * 100 + a[3] * 10 + a[1])* (a[2] * 10 + a[4])
	private static void yz(int[] a) {
		if ((a[0] * 10 + a[1]) * (a[2] * 100 + a[3] * 10 + a[4]) == 
				(a[0] * 100 + a[3] * 10 + a[1])* (a[2] * 10 + a[4])) {
			StringBuilder sb = new StringBuilder();
			sb.append(a[0]);
			sb.append(a[1]);
			sb.append("*");
			sb.append(a[2]);
			sb.append(a[3]);
			sb.append(a[4]);
			sb.append("=");
			sb.append(a[0]);
			sb.append(a[3]);
			sb.append(a[1]);
			sb.append("*");
			sb.append(a[2]);
			sb.append(a[4]);
			
			sets.add(sb.toString());
		}
	}

结果
142

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值