现在的位置: 首页 > 竞赛 > 正文

Top训练营调研试卷试题解析

2012年09月27日 竞赛 ⁄ 共 1020字 ⁄ 字号 暂无评论

这里给出了部分题目的解答,请在尝试自己思考和尝试后,阅读解答。

【1288 爱因斯坦的数学题】

爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨2阶,则最最后剩一阶,若每步跨3 阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶。只有每次跨7阶,最后才正好一阶不剩。请问这条阶梯共有多少阶?本题有多个答案,只需要输出其中的最小值。

基本思路:本题使用了取余运算。 只需要穷举自然数 x,然后判断这个自然数 x 是否满足条件即可。若每步跨2阶,则最后剩一阶,写成数学表达就是 x%2 == 1,其他类似。

优化: 可以缩小穷举的范围,从题目中,可以推断出满足要求的 x 一定是 7 的倍数,而且是奇数。 这样 x 的起始值可以从 7 开始, 递增14。这样做有两个好处:1)x的范围缩小;2)判断条件简化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main(int argc, char *argv[])
{
    int x=7;
    while (1) {
        if (x%3==2 && x%5==4) {
            printf("%d\n", x);
            break;
        }
        x += 14;
    }
    return 0;
}

这个C程序可以很容易的转化成Java版本。使用Eclipse创建类 P1288 (表示Problem 1288题),需要 mian函数,然后将5~12行复制过来,只需修改一个地方:while (1) -> while(true)

1
2
3
4
5
6
7
8
9
10
11
12
public class P1288 {
    public static void main(String[] args) {
        int x=7;
        while (true) { 
            if (x%3==2 && x%5==4) {
                System.out.printf("%d\n", x);
                break;
            }
            x += 14;
        }
    }
}

注意:提交程序时,需要将类名改成 Main,否则会出现“编译错误”。

抱歉!评论已关闭.