黑色星期五

问题描述

有些西方人比较迷信,如果某个月的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版本

猜你喜欢

转载自blog.csdn.net/qq_28202661/article/details/77986552