【省赛B组】2013年第四届蓝桥杯(解法通用)

文章目录

  • 首先,题目大致介绍(总10题)
  • 001 世纪末的星期日(两种解法)
  • 002 马虎的算式 (暴力)
  • 003 振兴中华 (递归)
      • (1)递归解法1
      • (2)递归解法2
  • 004 黄金连分数

首先,题目大致介绍(总10题)

1~4四题是结果填空,方法不限只要得到最后结果。
5~10三题是编程大题,主要考察算法基本功、编程基本功以及编程解决问题。


001 世纪末的星期日(两种解法)

一、题目描述

曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。还有人称今后的某个世纪末的12月31日,如果是星期一则会…,有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! 于是,“谣言制造商”又修改为星期日…

1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?

请回答该年份(只写这个4位整数,不要写12月31等多余信息)

二、题解

须知

  • java 日历的数组中 {1,2,3,4,5,6,7} 依次对应 {星期日,星期一,星期二,星期三,星期四,星期五,星期六}
  • 因为1999年的12月31日是星期五是世纪末日的谣言已被攻破,所以循环变量i1999+100==2099年开始

(1)日期类

import java.util.Calendar;
import java.util.Date;
public class Main {
public static void main(String[] args) {
   Calendar c = Calendar.getInstance();
   for (int i=2099;; i+=100) {		//因为是每一个世纪末年
     c.set(i, 11, 31);				//0对应1月,11对应12月
     if(c.get(Calendar.DAY_OF_WEEK) == 1) {//一个星期中的第几数,1对应星期日
       System.out.println(i); break;
     }
   }
  }
}

(2)常规解法

如果要按逻辑走,需要注意的地方:

  • 要判断闰年,这里给出判断公式:year%4==0&&year%100!=0||year%400==0
  • (sum+5)%7==0从何而来?因为1999年的12月31日是星期五,2000-1-1是星期六,则可以构造 (1 + ?)%7==6,?为5时等式才成立,由此得出要是星期天,(sum+5)%7==0才满足条件.
private static void f2() {
  int sum=0;
  for (int i = 2000; ;i++) {
    sum+=(i%4==0&&i%100!=0||i%400==0)?366:365;
    if(i % 100 == 99 && (sum+5) % 7 == 0) {
      System.out.println(i); break;
    }
  }
}

(3) excel巧解

(1) 在 A1单元格 中输入1999-12-31,在B1单元格中输入内置函数 WEEKDAY(A1,2),然后按回车,将会出现5,代表星期五

  • 第一个参数是想到得到对应星期的日期所在的单元格位置
  • 第二个参数见图二
【省赛B组】2013年第四届蓝桥杯(解法通用)_第1张图片 【省赛B组】2013年第四届蓝桥杯(解法通用)_第2张图片

(2) 选中 A1,A2单元格,向下拖拽图一中标志的小黑点,将会得到图一的效果,B列的操作同理

(3) 从图一B列找最早的数字7对应的A列数据即找到最近的世纪末。

答案:2299


002 马虎的算式 (暴力)

一、题目描述

小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。

有一次,老师出的题目是:36 x 495 = ?

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

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

因为 36 * 495 = 396 * 45 = 17820

类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54

假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)

能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?

满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。

二、题解

题目这么多文字,最有用的莫过于这个公式:ab * cde = adb * ce,有了公式,直接暴力破解即可,题目有abcde五个字母,就可以定义5个变量[1, 9]

条件:

  • abcde各不相同
  • ab * cde == ad*b * ce
package B_第四届省赛;
/**
 * @Author: Hoji
 * @Description:
 * @Date: 11/18/2019 8:32 PM
 */
public class B2_马虎的算式 {
  public static void main(String[] args) {
    int sum=0;
    for(int a=1;a<10;a++)
    for(int b=1;b<10;b++)
    for(int c=1;c<10;c++)
    for(int d=1;d<10;d++)
    for(int e=1;e<10;e++)
    if(a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e)
    if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e))
      sum++;
    System.out.println(sum);
  }
}

答案:142


003 振兴中华 (递归)

一、题目描述

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

从我做起振
我做起振兴
做起振兴中
起振兴中华

比赛时,先站在左上角的写着“”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束

要求跳过的路线刚好构成“从我做起振兴中华”这句话。

请你帮助小明算一算他一共有多少种可能的跳跃路线呢?答案是一个整数。

二、题解(递归)

咋一看,可能最初想到的就是什么DFS、BFS?大可不必,才第3题

这里只需开一个存储跳过的字符的record数组,在填满的情况下与与字符串s里的汉字进行比较

  • 如果相等那么count+1
  • 如果不相等,那么,继续递归

注意:

  • 向下跳指的是往二维数组的y轴负方向,所以x<3
  • 向右跳指的是往二维数组的x轴正方向,所以y<4

(1)递归解法1

/**
 * @Author: Hoji
 * @Description:
 * @Date: 2019-11-12
 */
public class 振兴中华 {
  private static int count;
  private static char[][] data= {
          {'从','我','做','起','振'},
          {'我','做','起','振','兴'},
          {'做','起','振','兴','中'},
          {'起','振','兴','中','华'}};
  private static String s = "从我做起振兴中华";

  public static void main(String[] args) {
    char[] record = new char[8];
    jump(0, 0, 0, record);
    System.out.println(count);
  }
  public static void jump(int step, int x, int y, char[] record) {
    if(x > 3) return;
    if(y > 4) return;
    if(step > 7)  return;
    //record[strp]:记录每一跳中的字
    record[step] = data[x][y];
    if(step == 7 && s.equals(String.valueOf(record))) {
      ++count;
      return;
    }
    jump(step+1, x+1, y, record);   //向下
    jump(step+1, x, y+1, record);   //向右
  }
}

(2)递归解法2

由题意得,向上跳、向下跳不可能构成符合条件的路径,所以只能想下跳、向右跳,所以当向右跳到了尽头后(y == 4),路径也就自然确定了,向下跳到尽头(x==3),路径也确定了,故可以写出最终的递归条件.

public static void main(String[] args) { 
  System.out.println(f(0,0)); 
}
public static int f(int x, int y){
  if (x == 3 || y == 4)
    return 1;
  return f(x + 1, y) + f(x, y + 1);
}

答案:35


004 黄金连分数

一、题目描述

黄金分割数0.61803...是个无理数, 请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。

小数点后3位的值为:0.618
小数点后4位的值为:0.6180
小数点后5位的值为:0.61803
小数点后7位的值为:0.6180340
(注意尾部的0,不能忽略)

你的任务是:写出精确到小数点后100位精度的黄金分割值。
注意:尾数的四舍五入! 尾数是0也要保留!显然答案是一个小数,其小数点后有100位数字

二、题解

未完....

你可能感兴趣的:(【省赛B组】2013年第四届蓝桥杯(解法通用))