爱因斯坦的数学题
爱因斯坦出了一道这样的数学题:有一条很长的楼梯,若每步跨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