蓝桥杯试题-黑色星期五

原题

资源限制

时间限制:1.0s 内存限制:512.0MB


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


样例输入

1998


样例输出

3

解法

思想

可以偷懒使用Calendar类或者被废弃的Date,不过要求对Calendar类比较熟悉。。

不然就按闰年的情况去处理日期吧。。

代码

java api:

import java.util.Calendar;
import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int year = scanner.nextInt();
        int count = 0;
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR,year);
        for(int i = 0;i<12;i++){
            calendar.set(Calendar.MONTH,i);
            calendar.set(Calendar.DATE,13);
            if(calendar.get(Calendar.DAY_OF_WEEK)==Calendar.FRIDAY) count ++;
        }
        System.out.println(count);
    }
}

硬算:

import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int year = scanner.nextInt();
        int firstDay = getFirstDay(year);
        boolean isLeap = (year%4==0&&year%100!=0)||(year%100==0&&year%400==0);
        int count = 0;
        for(int i = 1;i<=12;i++){
            switch (i){
                case 1:
                    firstDay = (firstDay+12%7)%7;
                    if(firstDay == 4) count++;
                    break;
                case 3:
                    firstDay = (firstDay+(isLeap?29:28)%7)%7;
                    if(firstDay == 4) count++;
                    break;
                case 5:
                case 7:
                case 10:
                case 12:
                    firstDay = (firstDay+30%7)%7;
                    if(firstDay == 4) count++;
                    break;
                default:
                    firstDay = (firstDay+31%7)%7;
                    if(firstDay == 4) count++;
                    break;
            }
        }
        System.out.println(count);
    }

    public static int getFirstDay(int year){
        if(year == 1998) return 3;
        int lastYear = year -1;
        if((lastYear%4==0&&lastYear%100!=0)||(lastYear%100==0&&lastYear%400==0)) return (getFirstDay(lastYear)+366%7)%7;
        else return (getFirstDay(lastYear)+365%7)%7;
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/%e8%93%9d%e6%a1%a5%e6%9d%af%e8%af%95%e9%a2%98-%e9%bb%91%e8%89%b2%e6%98%9f%e6%9c%9f%e4%ba%94/

发表评论

电子邮件地址不会被公开。