JAVA蓝桥杯(3)猜算式
2017-02-15 23:17
393 查看
问题描述
看下面的算式:□□ x □□ = □□ x □□□
它表示:两个两位数相乘等于一个两位数乘以一个三位数。
如果没有限定条件,这样的例子很多。
但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。
该算式中1至9的每个数字出现且只出现一次!
比如:
46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186
…..
请编程,输出所有可能的情况!
注意:
左边的两个乘数交换算同一方案,不要重复输出!
不同方案的输出顺序不重要
解决方法
import java.util.HashMap; import java.util.HashSet; import java.util.Vector; public class Question3 { private static HashMap<String, StringBuffer> map = new HashMap<String, StringBuffer>(); private static HashSet<String> set = new HashSet<String>(); public static void main(String[] args) { Vector<Integer> source = new Vector<Integer>(); for (int i = 1; i <= 9; i++) {// 构造初始数据 source.add(i); } Vector<Integer> result = new Vector<Integer>(); new Question3().prem(source, result);// 递归 for (String key : map.keySet()) {// 输出结果 System.out.println(map.get(key).substring(0, 2) + " x " + map.get(key).substring(0, 2) + " = " + map.get(key).substring(0, 2) + " x " + map.get(key).substring(0, 2)); } } // 递归实现全排列 private void prem(Vector<Integer> source, Vector<Integer> result) { if (source.size() == 0) { StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < result.size(); i++) { stringBuffer.append(result.elementAt(i)); } int a = Integer.parseInt(stringBuffer.substring(0, 2)) * Integer.parseInt(stringBuffer.substring(2, 4)); int b = Integer.parseInt(stringBuffer.substring(4, 6)) * Integer.parseInt(stringBuffer.substring(6, 9)); if (a == b) { String tmp = new StringBuffer(stringBuffer.substring(2, 4)).append(stringBuffer.substring(0, 2)) .toString();// 正常前四位 String tmpresv = new StringBuffer(stringBuffer.substring(0, 2)).append(stringBuffer.substring(2, 4)) .toString();// 翻转后的前四位 if (set.add(tmp) && set.add(tmpresv)) {// 去除前四位重复的值,利用HashSet的值唯一特点 map.put(tmp, stringBuffer); } } } for (int i = 0; i < source.size(); i++) { Vector<Integer> tsource = new Vector<Integer>(source); Vector<Integer> tresult = new Vector<Integer>(result); tresult.add(source.elementAt(i)); tsource.remove(i); new Question3().prem(tsource, tresult); } } }
运行结果
54 x 54 = 54 x 54 63 x 63 = 63 x 63 73 x 73 = 73 x 73 76 x 76 = 76 x 76 58 x 58 = 58 x 58 64 x 64 = 64 x 64 58 x 58 = 58 x 58 54 x 54 = 54 x 54 46 x 46 = 46 x 46 58 x 58 = 58 x 58 58 x 58 = 58 x 58
相关文章推荐
- TYVJ P1045 最大的算式
- [USACO2.3.3][zerosum零的算式和][dfs]
- 60-思考题(5)-将1到9 这九个数字分成若干个数,满足一定的算式
- 问题四十六: 在下面的加法算式中,不同的符号代表不同的数字,相同的符号代表相同的数字。
- 新秀模拟题③——填写乘法算式
- 马虎的算式
- “趣味算式”——匪警请拨110……蓝桥杯
- 2013-11-06 实验之趣味110算式(递归求解思维)
- 2012蓝桥杯【初赛试题】古堡算式
- 蓝桥杯 第三届C/C++预赛真题(2) 古堡算式(数学题)
- 算法基础-枚举与剪枝_观察算式
- 2012蓝桥杯C++本科 古堡算式
- 古堡算式 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA
- 算式
- 神奇的算式——第五届蓝桥杯省赛C语言A组第5题
- 蓝桥杯 猜算式
- 凑算式
- sicily 2501. 算算式
- 蓝桥杯 算法训练 最大的算式(DP)
- 蓝桥杯历届-古堡算式