蓝桥杯 黑色星期五(Java)

1.题目

有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是"诸事不宜”。
请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形,以帮助你的迷信朋友解决难题。
说明:
(1) - -年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份; .
(2)已知1998年1月1 日是星期四,用户输入的年份肯定大于或等于1998年。
输入格式:输入只有一-行,即某个特定的年份(大于或等于1998年)。
输出格式:输出只有一-行,即在这一年中,出现了多少次既是13号又是星期五的情形。
输入输出样例
样例输入1998
样例输出3

2.思路

看着还是挺简单的,只需要从1998年1月1日星期四往后面循环找就行了,当输入的年份大于1998,从1998年循环到目标年就行了。主要采用swith。采用一个计数器来记录一年中有多少个13号是星期五,每一年记得清零,还有一个记录星期几的变量,是不断变化的,记住,当年变化的时候不能重置这个变量。

3.代码

import java.util.Scanner;

public class T3 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int goalYear = sc.nextInt();
		int res = solution(goalYear);
		System.out.println(res);
	}
	/**
	 * @param goalYear 传入的年数
	 * @return 那一年有几天的13号恰好是星期五
	 */
	public static int solution(int goalYear) {
		// 5.最后需要用个循环,不是每年的1月1日都是星期四
		int whichDay = 3;
		int count = 0;
		// 已知1998年1月1 日是星期四
		// 忘了每一年都要去判断是不是闰年,必须要写进循环里边
		for (int xunhuan = 0; xunhuan <= goalYear - 1998; ++xunhuan) {
			// 1.判断是不是闰年
			boolean isRunNian = false;
			if (((xunhuan + 1998) % 100 == 0 && (xunhuan + 1998) % 400 == 0)
					|| ((xunhuan + 1998) % 4 == 0 && (xunhuan + 1998) % 100 != 0)) {
				// 是闰年
				isRunNian = true;
			}
			count = 0;// 记录既是13号又是星期五的天数
			// 要知道前一年的12月31号是星期几
			// 2.先模拟循环十二个月
			for (int i = 1; i <= 12; ++i) {
				// 3.再用swith 语句,先用循环模拟每个月份
				switch (i) {
				case 1:
				case 3:
				case 5:
				case 7:
				case 8:
				case 10:
				case 12: {// 每月有31天
					// 4.具体的确定是星期几了
					for (int j = 1; j <= 31; ++j) {
						whichDay += 1;
						if (whichDay == 8) {
							whichDay = 1;
						}
						if (j == 13 && whichDay == 5) {
							count += 1;
						}
					}

				}
					break;
				case 4:
				case 6:
				case 9:
				case 11: {
					for (int j = 1; j <= 30; ++j) {
						whichDay += 1;
						if (whichDay == 8) {
							whichDay = 1;
						}
						if (j == 13 && whichDay == 5) {
							count += 1;
						}
					}
				}
					break;
				case 2: {
					if (isRunNian) {
						for (int j = 1; j <= 29; ++j) {
							whichDay += 1;
							if (whichDay == 8) {
								whichDay = 1;
							}
							if (j == 13 && whichDay == 5) {
								count += 1;
							}

						}
					} else if (!isRunNian) {
						for (int j = 1; j <= 28; ++j) {
							whichDay += 1;
							if (whichDay == 8) {
								whichDay = 1;
							}
							if (j == 13 && whichDay == 5) {
								count += 1;
							}
						}
					}
				}
					break;
				default:
					throw new IllegalArgumentException("Unexpected value: " + i);
				}
			}
		}
		return count;
	}
}

4.我的问题:由于闰年判断没有写进循环,导致花费大量时间调试找错,每一年都需要判断是不是闰年,做的时候把这一点忽略了

上一篇:第十六题——[极客大挑战 2019]Upload


下一篇:RoarCTF 2019 - Easy Calc