问题描述
有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形,以帮助你的迷信朋友解决难题。
说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;(2)已知1998年1月1日是星期四,用户输入的年份肯定大于或等于1998年。
输入格式:输入只有一行,即某个特定的年份(大于或等于1998年)。
输出格式:输出只有一行,即在这一年中,出现了多少次既是13号又是星期五的情形。
样例输入
1998
样例输出
3
思路:
从1998年往输入的年份推,计算输入年份当年的13号又是星期5的情况
代码实现:
- Java版
import java.util.Scanner; //引入Scanner
public class Black_Friday {
static Scanner scan = new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.print("请输入年份:");
int inputs = scan.nextInt();
System.out.print("当前年份目标次数为:" + Counts(inputs));
}
public static int Counts(int e) {
int years; // 年份
int day_month = 1; // 月份
int day_week = 4; // 星期几
int cnt = 0; // 统计既是13号又是星期五的出现次数
int i;
int k;
int[] a = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // 平年月份天数
years = e;
for (i = 1998; i <= years; i++) {
// 首先判断平年还是闰年,更改月份参数表
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
a[1] = 29;
} else {
a[1] = 28;
}
k = 0; // 月份参数表数组下标
while (true) {
day_month++; // 日自增
day_week = (day_week + 1) % 7; // 星期重置,0为星期日
if (day_month == 13 && day_week == 5 && i == years) {
cnt++; // 目标次数+1
}
if (day_month == a[k]) { // 到了月尾
day_month = 0;
k++;
if (k >= 12) { // 到了年尾
break;
}
}
}
}
return cnt;
}
}
尾注:本题参考的是珍惜每分每秒–>算法训练 黑色星期五的C/C++版思路,在此改为Java版本