穷举法:一道爱因斯坦的数学题

爱因斯坦的数学题

爱因斯坦出了一道这样的数学题:有一条很长的楼梯,若每步跨2阶,则最后剩1阶;若每步跨3阶,则最后剩2阶;若每步跨5阶,则最后剩4阶;若每步跨6阶则最后剩5阶;每次跨7阶,最后才正好一阶不剩。请问这个楼梯至少有多少阶?

分析

设总台阶是n阶,那么满足以下五个条件:

  • n % 2 == 1
  • n % 3 == 2
  • n % 5 == 4
  • n % 6 == 5
  • n % 7 == 0

由于n是自然数,且题目要求最小的n,所以可以从1开始,自增加1,当满足所有条件时,判断结束。另外,在使用枚举法的时候可以通过一些对范围的优化减少循环次数,如根据 n % 2 == 1,可以只考虑奇数,将每次的步长设置为2,从而减少了一半的计算量。但本题目主要是用于演示穷举法的思路,故不考虑优化。

实现

	public static void main(String[] args){
		int n = 1; // 要求的n
		while(true) {
			if(n % 2 == 1 && n % 3 == 2 && n % 5 == 4 && n % 6 == 5 && n % 7 == 0 )
				break;
			n++;
		}
		System.out.println("n = " + n);
	}

输出为: n = 119

扩展

如果想获得更多满足条件的数,我们可以进行一个简单的必定,在满足条件时,输出并记录个数,然后达到指定的个数后退出循环。

	public static void main(String[] args){
		int n = 1;
		int numberToBePrinted = 20; // 输出20个满足条件的数据 		
		int count = 0; // 计数器
		while(count < numberToBePrinted) {
			if(n % 2 == 1 && n % 3 == 2 && n % 5 == 4 && n % 6 == 5 && n % 7 == 0 ) {
				count++;
				System.out.println(count + ": n = " + n);
			} 
			n++;
		}
	}

结果

1: n = 119
2: n = 329
3: n = 539
4: n = 749
5: n = 959
6: n = 1169
7: n = 1379
8: n = 1589
9: n = 1799
10: n = 2009
11: n = 2219
12: n = 2429
13: n = 2639
14: n = 2849
15: n = 3059
16: n = 3269
17: n = 3479
18: n = 3689
19: n = 3899
20: n = 4109

你可能感兴趣的:(算法设计与分析)