凑算式(全排列 + 判断)

1. 问题描述:

凑算式

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

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

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?

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

2. 思路分析:

① 由题目中可以知道A-I代表着1 - 9个不同的数字,所以我们首先想到的先求解出1-9数字的全排列然后对形成的每一个排列进行判断,题目中给出的例子中其中8 / 3是除不完的,但是我们将两个8 / 3与 952 / 714通分之后发现是可以进行整除的,所以这里是在判断的时候需要注意的一个点

② 全排列我们可以使用递归的方法:交换当前元素与当前元素之后(包括当前元素)的元素形成全排列,实际上这也是一个求解全排列的一个模板,我们可以记住直接使用,在求解出一个排列之后进行判断,即可以在出口的时候使用一个方法来判断当前数组中的排列是否满足题目的要求,判断的时候需要将两个分式进行通分,判断一下通分之后是否能够整除而且加上之前的那个数字是否等于10

③ 实际上这道题目考察的就是怎么样求解全排列,在出口的时候加上一些条件判断就可以了

3. 求解的结果有29种,代码如下:

public class Main {
	static int count = 0;
	public static void main(String[] args) {
		int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
		f(arr, 0);
		System.out.println(count);
	}
	
	private static void f(int[] arr, int k) {
		if(k == 9){
			if(check(arr)){
				for(int i = 0; i < 9; i++){
					System.out.print(arr[i] + " ");
				}
					System.out.print("\n");
					count++;
			}
			return;
		}
		//注意i应该等于k这样才是对的,很容易写着写着就写成i = 0了
		for(int i = k; i < 9; i++){
			int t = arr[i];
			arr[i] = arr[k];
			arr[k] = t;
			f(arr, k + 1);
			t = arr[i];
			arr[i] = arr[k];
			arr[k] = t;
		}
	}

	private static boolean check(int[] arr) {
		//特别要注意下面有的需要添加上括号否则很容易出现错误
		int x = arr[3] * 100 + arr[4] * 10 + arr[5];
		int y = arr[6] * 100 + arr[7] * 10 + arr[8];
		int t = arr[1] * y + arr[2] * x;
		if(t % (arr[2] * y) == 0 && (arr[0] + t / (arr[2] * y)) == 10){
			return true;
		}
		return false;
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值