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