蓝桥杯JavaB组 3. 凑算式

题目:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

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

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

比如下面有两种解法:

6+8/3+952/714

5+3/1+972/486

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

分析:

  1. 首先分析题目,式子中的九个字母所代表的数字组成的式子满足 == 10,问有多少种解法。注意:DEF是一个三位数的数字而不是三个数相乘。题目的意思可以理解为:一个9位数的数字,取1 - 9的数字来填,要求这个数字不重复,然后将9位数的每个数的位置对应A - I,求满足上述式子的数的种数。
  2. 注意:这里会有两个小坑,一是:题目给的0 - 9,其实是1 - 9的数字,在代码中用0来除会报错。二是:看题目给出的解法示例: 6+8/3+952/714 ,其中两个数是不能整除的,但是其通分后是可以整除的,所以在设置if判断时我们需要将式子稍微变形。
  3. 开始写代码计算
    • 由于是填空题不用考虑太多直接干暴力
      由分析第2点,可以写出,直接9个for嵌套,if里面要求,每个组成的9位数不重复且满足式子 == 10通分后可以整除
    • 代码也可以稍微精致一点,这里我用的java写,对于全排列的题用回溯是一个比较好的写法

类似题目:
蓝桥杯JavaB组 2.纸牌三角形

代码:

答案:29
//暴力
	public static void bruteForce() {
		int result = 0;
		for (int a = 1; a <= 9; a++) {
			for (int b = 1; b <= 9; b++) {
				for (int c = 1; c <= 9; c++) {
					for (int d = 1; d <= 9; d++) {
						for (int e = 1; e <= 9; e++) {
							for (int f = 1; f <= 9; f++) {
								for (int g = 1; g <= 9; g++) {
									for (int h = 1; h <= 9; h++) {
										for (int i = 1; i <= 9; i++) {
											if((a + (((g * 100 + h * 10 + i) * b) + ((d * 100 + e * 10 + f) * c)) / ((g * 100 + h * 10 + i) * c) == 10) 
													&& ((((g * 100 + h * 10 + i) * b) + ((d * 100 + e * 10 + f) * c)) % ((g * 100 + h * 10 + i) * c)) == 0													
													&& a != b
													&& a != c && a != d
													&& a != e && a != f
													&& a != g && a != h
													&& a != i 
													&& b != c
													&& b != d && b != e
													&& b != f && b != g
													&& b != h && b != i
													&& c != d && c != e
													&& c != f && c != g
													&& c != h && c != i
													&& d != e && d != f
													&& d != g && d != h
													&& d != i && e != f
													&& e != g && e != h
													&& e != i && f != g
													&& f != h && f != i
													&& g != h && g != i
													&& h != i)
												result++; 
										}
									}
								}
							}
						}
					}
				}
			}
		}
		System.out.println(result);
	}
//回溯
	static int ans;
	static int arr[] = {1,2,3,4,5,6,7,8,9};
	static boolean check() {
		int x = arr[3] * 100 + arr[4] * 10 + arr[5];
		int y = arr[6] * 100 + arr[7] * 10 + arr[8];
		if ((x * arr[2] + y * arr[1]) % (y * arr[2]) == 0 && arr[0] + ((x * arr[2] + y * arr[1]) / (y * arr[2])) == 10)
			return true;
		return false;
	}
	static void f(int k) {
		if (k == 9) {
			if (check())
				ans++;
		}
		for (int i = k; i < 9; i++) {
			{int temp = arr[i]; arr[i] = arr[k];arr[k] = temp;}
			f(k + 1);
			{int temp = arr[i]; arr[i] = arr[k];arr[k] = temp;}
		}
	}
	//回溯法在main方法里是调用f(0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值