蓝桥杯练习3:9数算式

9数算式

观察如下的算式:

9213 x 85674 = 789314562

左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。

请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?

注意:
1. 总数目包含题目给出的那个示例。
2. 乘数和被乘数交换后作为同一方案来看待。

代码示例:

/**
 * 全排列问题(深度搜索字典序)
 * 
 * @author Swing
 * 
 */
public class Main {
	char[] arr = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
	// 每种可能的结果输出数组
	char[] result = new char[arr.length];
	// 标记数组,记录数字是否被用过(1为用过)
	int[] tagArray = new int[arr.length];
	int count = 0;

	/**
	 * DFS
	 * 
	 * @param layer
	 *            深度
	 */
	public void fullPermutation(int layer) {
		// 递归到最后一层的下一层,打印
		if (layer > arr.length - 1) {
			String string = new String(result);
			if (!string.startsWith("0") && !string.endsWith("0")) {
				String[] strings = string.split("0");
				int a = Integer.parseInt(strings[0]);
				int b = Integer.parseInt(strings[1]);
				int c = a * b;
				if (check(c))
					count++;
			}
		} else {
			for (int i = 0; i < arr.length; i++) {
				// 如果此数在本次深度下未使用过
				if (tagArray[i] == 0) {
					tagArray[i] = 1;
					result[layer] = arr[i];
					fullPermutation(++layer);
					tagArray[i] = 0;
					layer--;
				}
			}
		}

	}

	/**
	 * 检查结果数是否满足条件
	 * 
	 * @param num
	 * @return
	 */
	public boolean check(int num) {
		String string = new Integer(num).toString();
		for (int i = 1; i < 10; i++) {
			String s = new Integer(i).toString();
			if (!string.contains(s))
				return false;
		}
		return true;
	}

	public static void main(String[] args) {
		Main main = new Main();
		main.fullPermutation(0);
		System.out.println(main.count / 2);
	}

}

发布了58 篇原创文章 · 获赞 75 · 访问量 6662

猜你喜欢

转载自blog.csdn.net/qq_42013035/article/details/103505922
今日推荐