猜算式

package cn.dlpu.lby;

import java.util.ArrayList;
import java.util.List;

public class Guesssuanshi {

	/*
	 * 猜算式 看下面的算式: □□ 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 .....
	 * 请编程,输出所有可能的情况! 注意: 左边的两个乘数交换算同一方案,不要重复输出! 不同方案的输出顺序不重要
	 */
	static List<String> arr1 = new ArrayList<String>();
	static List<String> arr2 = new ArrayList<String>();

	private static void print() {
		// TODO Auto-generated method stub
		for (int i = 0; i < arr2.size(); i++) {
			String a = arr2.get(i).substring(0, 2);
			String b = arr2.get(i).substring(2, 4);
			String c = arr2.get(i).substring(4, 6);
			String d = arr2.get(i).substring(6);
			System.out.println(a + " X " + b + "=" + c + " X " + d);
		}
	}

	private static void fun() {
		// TODO Auto-generated method stub
		int[] n = new int[9];
		init(n);
		sort(n, 0, n.length - 1);
		removeDuplicate();
	}

	// 去除重复的元素
	private static void removeDuplicate() {
		// TODO Auto-generated method stub
		arr2.add(arr1.get(0));
		boolean flag = true;
		for (int i = 1; i < arr1.size(); i++) {
			for (int j = 0; j < arr2.size(); j++) {
				flag = dup(arr1.get(i), arr2.get(j));
				if (flag)
					break;
			}
			if (!flag)
				arr2.add(arr1.get(i));

		}
	}

	// 判断是否重复
	private static boolean dup(String string1, String string2) {
		// TODO Auto-generated method stub
		String a = string1.substring(0, 2);
		String b = string1.substring(2, 4);
		String c = string2.substring(0, 2);
		String d = string2.substring(2, 4);
		if (a.equals(d) && b.equals(c))
			return true;
		else
			return false;
	}

	// 将数组全排列
	private static void sort(int[] n, int start, int end) {
		// TODO Auto-generated method stub
		if (start >= end) {
			check(n);
			return;
		} else {
			for (int i = start; i <= end; i++) {
				int t = n[start]; // 交换元素
				n[start] = n[i];
				n[i] = t;

				sort(n, start + 1, end);

				t = n[start]; // 还原元素
				n[start] = n[i];
				n[i] = t;
			}

		}
	}

	// 检查是否符合要求
	private static void check(int[] n) {
		// TODO Auto-generated method stub
		StringBuffer sb = new StringBuffer();
		for (int i : n)
			sb.append(i);
		int a = Integer.parseInt(sb.substring(0, 2));
		int b = Integer.parseInt(sb.substring(2, 4));
		int c = Integer.parseInt(sb.substring(4, 6));
		int d = Integer.parseInt(sb.substring(6));
		if (a * b == c * d)
			arr1.add(sb.toString());
	}

	// 初始化数组
	private static void init(int[] n) {
		// TODO Auto-generated method stub
		for (int i = 0; i < 9; i++) {
			n[i] = i + 1;
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		fun();
		print();

	}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值