算法基础篇之穷举法实例——填数游戏

在小学奥数题中,经常会看到一些填数字游戏,其中每个汉字都表示一个不同的数字,要求填写出这些汉字分别代表哪个数字,最后使得算式成立。记得那时候最烦做这类题,现在我们用编程的思想去解决,这样计算快多了。以后就可以向学奥数的小盆友炫耀了。

题目:

算法描述题

X        算

————————

    题题题题题题

每个汉字表示从0~9的一个整数,且不同汉字之间代表的整数是不同的,要求找出这些汉字表示的整数,使得算式成立。

分析:

这种类型的题目有两个特点:一是无规律性,也就是我们没有办法按照一定的规律从众多的候选答案中找到正解;二是有穷性,也就是说这种题目在计算量上总会有一个上界,要么在上界范围内即可得出正解,要么不存在正解。

对每一个汉字设置一个变量,并划分出变量范围:


汉字 变量符号 变量范围
i 1~9
j 0~9
k 0~9
l 0~9
m 1~9

然后穷举所有可能性,直到满足条件为止。

代码:

public class fillNum {
	private long multi1 = 0;//表示被乘数
	private long multi2 = 0;//表示乘数
	private long result = 0;//表示结果
	private boolean isSolve = false;//表示在穷举范围内是否存在符合要求的解
	
	//执行穷举过程
	public void excute() {
		for(int i = 1; i <= 9; i++) {
			for(int j = 0; j <= 9; j++) {
				for(int k = 0; k <= 9; k++) {
					for(int l = 0; l <= 9; l++) {
						for(int m = 1; m <= 9; m++) {
							multi1 = i * 10000 + j * 1000 + k * 100 + l * 10 + m;
							multi2 = (long)i;
							result = m * 100000 + m * 10000 + m * 1000 + m * 100 + m * 10 + m;
							if((multi1 * multi2) == result) {
								isSolve = true;
								return;
							}
						}
					}
				}
			}
		}
		isSolve = false;
	}
	
	//打印穷举结果
	public void print() {
		if(isSolve) {
			System.out.println("  " + multi1);
			System.out.println("X     " + multi2);
			System.out.println("--------");
			System.out.println(" " + result);
		}
		else {
			System.out.println("不存在使等式成立的数据");
		}
	}
}

主函数如下:

public static void main(String[] args) {
		fillNum fn = new fillNum();
		fn.excute();
		fn.print();
	}

执行完成后,输出结果:

   79365
X         7
------------
 555555


小弟不才,纯属菜鸟一只,不知道有没有更优秀美观的算法。大神们如果有更好的算法,烦请赐教。谢谢啦!

你可能感兴趣的:(算法分析,算法实例)