第七届蓝桥杯 java 凑算式

本文探讨了一种特殊的数学凑算式问题,通过遍历和递归两种方法寻找所有可能的解法,确保每个数字1-9仅使用一次,满足特定的数学等式条件。代码示例展示了如何在Java中实现这一过程。

凑算式
在这里插入图片描述

(如果显示有问题,可以参见【图1.jpg】)

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

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

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

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
问题分析
解题思路就是遍历每一个位置,然后计算是否满足条件即可。
PS:
数字只能出现一次,所以使用一个数组来保存已出现过的数字;
如果是int类型的,在后面*1.00转换为double类型再相除。
代码一
暴力遍历即可

//此法为暴力解法,还有一种递归法。
public class Main {
	public static void main(String[] args){
		int count = 0;
		int[] arr = new int[10];
		for(int i = 0;i < 10;i++){
			arr[i] = 0;
		}
		for(int A = 1;A <= 9;A++){
			arr[A] = 1;
			for(int B = 1;B <= 9;B++){
				if(arr[B] == 1) continue;
				else arr[B] = 1;
				for(int C = 1;C <= 9;C++){
					if(arr[C] == 1) continue;
					else arr[C] = 1;
					for(int D = 1;D <= 9;D++){
						if(arr[D] == 1) continue;
						else arr[D] = 1;
						for(int E = 1;E <= 9;E++){
							if(arr[E] == 1) continue;
							else arr[E] = 1;
							for(int F = 1;F <= 9;F++){
								if(arr[F] == 1) continue;
								else arr[F] = 1;
								for(int G = 1;G <= 9;G++){
									if(arr[G] == 1) continue;
									else arr[G] = 1;
									for(int H = 1;H <= 9;H++){
										if(arr[H] == 1) continue;
										else arr[H] = 1;
										for(int I = 1;I <= 9;I++){
											if(arr[I] == 1) continue;
											//可以省略标记I
											else if(A+(B*1.00/C)+((D*100.00+E*10+F)/(G*100+H*10+I)) == 10){
												count++;
											}
										}
										arr[H] = 0;
									}
									arr[G] = 0;
								}
								arr[F] = 0;
							}
							arr[E] = 0;
						}
						arr[D] = 0;
					}
					arr[C] = 0;
				}
				arr[B] = 0;
			}
			arr[A] = 0;
		}
		System.out.println(count);
	}
}

代码二
使用递归遍历

public class Main {
	static int count = 0;
	static int exist[] = new int[9];
	public static void main(String[] args) {
		int a[] = new int[9];
		f(1,a);
		System.out.println(count);
	}
	public static void f(int m,int[] a){
		if(m == 10){
			if(check(a)) count++;
		}
		else{
			for(int i  = 1;i < 10;i++){
				if(exist[i-1] == 1) continue;
				else{
					a[m-1] = i;
					exist[i-1] = 1;
					f(m+1, a);
					exist[i-1] = 0;
				}
			}
		}
	}
	public static boolean check(int[] a){
		if( a[0] + ( (a[1]*1.00)/a[2] ) + ( (a[3]*100+a[4]*10+a[5]*1.00)/(a[6]*100+a[7]*10+a[8]) ) == 10) return true;
		else return false;
	}
}

如对该博客有意见或建议,欢迎留言或私信我^ _ ^

### 蓝桥杯 算式 解题思路与算法实现 #### 题目分析 蓝桥杯中的“算式”类题目通常涉及数字排列组合以及特定约束下的计算。例如,引用提到的几个问题都围绕着如何通过合理的数学运算满足给定条件展开。 对于此类问题的核心在于: 1. **全排列生成**:由于题目往往要求使用某些固定范围内的数字(如1到9),因此需要生成这些数字的所有可能排列。 2. **表达式的解析与验证**:根据题目定义的具体形式,构建相应的数学表达式并判断其是否符合条件。 3. **优化策略**:为了减少不必要的计算量,可以通过剪枝等方式提前排除不可能的情况。 --- #### 算法设计 ##### 方法一:基于递归回溯的解决方案 这种方法适用于解决像引用[1]中描述的那种复杂分数结构的问题。具体来说: - 使用递归来遍历所有可能的变量分配情况; - 对于每一个候选解,检查它是否能够使得整个等式成立; - 如果找到合法解,则记录下来或者立即返回结果。 以下是针对引用[5]所提问题的一个Python实现示例: ```python from itertools import permutations def solve_puzzle(): digits = '123456789' solutions = [] for perm in permutations(digits): # 枚举所有的排列方式 a, b, c_str, d, e, f, ghi_str = int(perm[0]), int(perm[1]), perm[2], \ int(perm[3]), int(perm[4]), int(perm[5]), perm[6:] try: if (a + b/c + int(c_str+d+e+f)/int(ghi_str)) == 10: solution = f"{a} + {b}/{c} + ({d}{e}{f})/({ghi_str}) = 10" solutions.append(solution) except ZeroDivisionError: continue return solutions result = solve_puzzle() print("\n".join(result)) ``` 上述代码利用`itertools.permutations()`函数来快速生成所需长度的序列,并逐一测试它们是否符合目标公式的要求[^1]。 --- ##### 方法二:穷举法结合位掩码技术 当面对类似于引用[2]那样的多位数乘积匹配情形时,可以考虑采用如下方法: - 利用位操作标记已使用的数字; - 循环尝试不同的分割点以形成左侧两因子及右侧三因子; - 计算所得乘积并与原始设定对比确认一致性; 下面是对应的一段伪代码片段展示这一逻辑流程的一部分: ```pseudo function findEquations() { let usedMask = 0; function backtrack(currentIndex){ if(all numbers are assigned){ check equation validity and collect results. } foreach possible assignment at currentIndex{ set corresponding bit in mask as occupied. call itself recursively with next index. reset the state after backtracking completes. } } } ``` 实际编码过程中还需要注意边界条件处理等问题[^2]. --- ##### 方法三:动态规划求最大值路径 最后一种常见模式体现在引用[4]里提出的最大化总和挑战上。这里推荐运用DP思想逐步累积最优子结构解答: 设状态转移方程为 `dp[i][j]`, 表达前i项分成j组的最大收益。则有关系式: \[ dp[i][k]=\max_{p<k}(dp[p][k-1]+sum(p,i)) \] 初始状态下设置单元素分组即可获得基础数值。之后迭代更新直至覆盖全部数据集为止[^4]。 --- ### 总结 综上所述,“算式”的核心难点集中在高效枚举潜在候选项的同时维持较高的执行效率之上。无论是借助显式的递归调用来探索树形空间还是依赖隐含的状态压缩技巧简化搜索过程,都需要开发者具备扎实的基础理论功底以及灵活变通的实际动手能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值