2013蓝桥杯Java B组省赛真题题解(持续更新)

简介: 目1:世界末日问题描述:

题目1:世界末日

问题描述:

曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。还有人称今后的某个世纪末的12月31日,如果是星期一则会。。。

有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!!

于是,“谣言制造商”又修改为星期日。

1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即XX99年)的12月31日正好是星期天?请回答该年份(只填写这4位整数即可)


实现代码:

import java.util.Calendar;
public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        for(int year = 1999; year < 10000; year += 100){
            calendar.set(Calendar.YEAR, year);
            calendar.set(Calendar.MOUTH, 11); //MOUTH从0开始计数,0为1月,对应11即12月
            calendar.set(Calendar.DAY_OF_MOUTH, 31);
            //1-7 分别对应 星期日-星期六
            if(calendar.get(Calendar.DAY_OF_WEEK) == 1){
                System.out.println(year);
          break;
            }
        }
    }
}

实现结果:

2299
1

题目2:马虎的算式

问题描述:

小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。有一次,老师出的题目是:36 * 495 = ?

他却给抄成了:396 * 45 = ?

但是结果却很戏剧性,他的答案竟然是正确的!!!

因为36 * 495 = 396 * 45 = 17820。类似这样的巧合还有很多,比如:27 * 594 = 297 * 54。

假设a b c d e代表1~9不同的五个数字(注意数字各不相同,且不含0)能满足形如:ab * cde = adb * ce 这样的算式一共有多少种呢?

请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。满足乘法交换律的算式计为不同的种类,所以答案是个偶数。


问题分析:

本题属于简单题,最容易想到的即是枚举暴力。将a b c d e作为五个变量,利用循环来求出满足条件的次数,即可计算出最终的答案。


实现代码:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        int counts = 0;// 用于计数
        // 循环中要注意满足数字各不相同的条件
        for(int a = 1; a < 10; a++){
            for(int b = 1; b < 10; b++){
                if(b!=a)for(int c = 1; c < 10; c++){
                    if(c!=a && c!=b)for(int d = 1; d < 10; d++){
                        if(d!=a && d!=b && d!=c)for(int e = 1; e < 10; e++){
                            if(e!=a && e!=b && e!=c && e!=d){
                                // ab * cde = adb * ce
                                if((a*10+b)*(c*100+d*10+e) == (a*100+d*10+b)*(c*10+e)){
                                    counts++;
                                }
                            }
                        }
                    }
                }
            }
        }
        System.out.println(counts);
    }
}

实现结果:

142 

题目3:振兴中华

问题描述:

小明参加了学校的趣味运动会,其中的一个项目是:跳格子。地上画着一些格子,每个格子里写一个字,如下所示:

从我做起振

我做起振兴

做起振兴中

起振兴中华

比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。要求跳过的路线刚好构成“从我做起振兴中华”这句话。

请你帮助小明算一算他一共有多少种可能的跳跃路线呢?

答案是一个整数,请通过浏览器直接提交该数字。


问题分析:

如下图所示,可以将所有格子看成一个5 * 4的棋盘格,左上角的“从”记(0, 0),我们暂且不考虑边界。比如,当小明位于(1, 1)时,他将有四种路线(上下左右)。分析问题我们可以很容易的发现,其实小明只能走右边或者下边,因为只有这样才有可能走出“从我做起振兴中华”这句话。即记小明坐标为(x, y),则小明每走一步后可面临的选择只有(x+1, y)或者(x, y+1)。

同时我们需要考虑边界问题,即当小明的坐标值x = 4或者y = 3时,小明到达边界。因此该问题我们可以用递归解决。


实现代码:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        System.out.println(dfs(0,0));
    }
    // 该方法用于递归所有可能的结果
    private static int dfs(int x, int y){
        // 递归终止条件
        if(x == 4 || y == 3){
            return 1;
        }
        return dfs(x+1, y) + dfs(x, y+1);
    }
}


实现结果:

35

题目4:黄金连分数

问题描述:

黄金分割数0.61803… 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。

比较简单的一种是用连分数:

1
黄金数 = -------------------------------
      1
    1 + --------------------
      1
    1 + -------------
      1
      1 + -------
      1 + ...

这个连分数计算的“层数”越多,它的值越接近黄金分割数。请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。

小数点后3位的值为:0.618

小数点后4位的值为:0.6180

小数点后5位的值为:0.61803

小数点后7位的值为:0.6180340 (注意尾部的0,不能忽略)


问题分析:

该问题最容易想到的方法是用递归来解决,但是显然这不是最优解。我们通过计算前几位分数,观察其结果分别为:1/2、2/3、3/5、5/8······可以发现,后面的每一个分数的分母都是前一相邻分数的分子与分母的和,而其分子则为前一项的分母。

而我们知道斐波那契数列1 1 2 3 5 8 ······就满足这样的特质,因此我们只需要用足够多的项来模拟,将最后两数相除并进行四舍五入,就可以得到想要的结果。


实现代码:

import java.math.*;
import java.util.*;
public class Main {
    public static void main(String[] args) {
        // 此题可以用斐波那契数列来模拟
        // 由于double类型的精度不能满足需求,使用BigInteger进行模拟
        BigInteger a = BigInteger.ONE;
        BigInteger b = BigInteger.ONE;
        // 这里需要注意,我们需要计算出小数点后100位的稳定值,因此多计算些位数更精准
        for(int i = 3; i < 500; i++){
            BigInteger temp = b;
            b = a.add(b);
            a = temp;
        }
        BigDecimal result = new BigDecimal(a, 110).divide(new BigDecimal(b, 110), BigDecimal.ROUND_HALF_DOWN); //以四舍五入的形式保存
        System.out.print(result.toPlainString().substring(0, 103));
    }
}

实现结果:

0.61803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113748


需要注意的是,我们在输出时截取了103项,也就是小数点后有101项,我们观察最后一位为8,因此最终保留100位小数的结果应该为:0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375


相关文章
|
4月前
|
人工智能 算法 Java
第十三届蓝桥杯B组Java(试题C:字符统计)
第十三届蓝桥杯B组Java(试题C:字符统计)
54 0
|
3月前
|
Java 数据安全/隐私保护 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-193 Password Suspects(C++&Java)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-193 Password Suspects(C++&Java)
20 1
|
3月前
|
机器学习/深度学习 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-Java全排列公式
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-Java全排列公式
37 0
|
3月前
|
算法 Java
蓝桥杯算法题——题解Java版本——切面条
蓝桥杯算法题——题解Java版本——切面条
36 0
|
3月前
|
Java
2014年蓝桥杯Java C组——猜年龄
2014年蓝桥杯Java C组——猜年龄
23 0
2014年蓝桥杯Java C组——猜年龄
|
4月前
|
算法 Java 测试技术
蓝桥杯-02-蓝桥杯Java组考点与14届真题
蓝桥杯-02-蓝桥杯Java组考点与14届真题
|
4月前
|
Java
第十三届蓝桥杯B组Java(试题B:山)
第十三届蓝桥杯B组Java(试题B:山)
29 0
|
4月前
|
存储 Java API
第十三届蓝桥杯B组Java(试题A:星期计算)
第十三届蓝桥杯B组Java(试题A:星期计算)
43 0
|
5月前
|
SQL Java 数据库连接
③【Java组】蓝桥杯省赛真题 持续更新中...
③【Java组】蓝桥杯省赛真题 持续更新中...
33 0
|
5月前
|
Java
③【Java 组】蓝桥杯省赛真题 [黄金连分数][马虎的算式]持续更新中...
③【Java 组】蓝桥杯省赛真题 [黄金连分数][马虎的算式]持续更新中...
28 0