算法笔记_154:算法提高 日期计算(Java)

目录

1 问题描述

2 解决方案

 


1 问题描述

问题描述

  已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。

输入格式

  输入只有一行
  YYYY MM DD

输出格式

  输出只有一行
  W

数据规模和约定

  1599 <= YYYY <= 2999
  1 <= MM <= 12
  1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
  1 <= W <= 7,分别代表周一到周日

样例输入

2011 11 11

样例输出

5


2 解决方案

具体代码如下:

import java.util.Scanner;

public class Main {

    public boolean judgeYear(int year) {
        if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
            return true;  //此时为闰年
        return false;   //此时为平年
    }

    public int getMonth(int year, int month) {  //获取月份天数
        if(month == 1 || month == 3 || month == 5 || month == 7 ||
                month == 8 || month == 10 || month == 12)
            return 31;
        if(month == 4 || month == 6 || month == 9 || month == 11)
            return 30;
        if(judgeYear(year) && month == 2)
            return 29;
        if(!judgeYear(year) && month == 2)
            return 28;
        return 0;
    }

    public void getResult(String date) {
        String[] temp = date.split(" ");
        int year = Integer.valueOf(temp[0]);
        int month = Integer.valueOf(temp[1]);
        int day = Integer.valueOf(temp[2]);
        int countDay = 0;
        int result = 0;  //最终结果
        if(year > 2011) {
            for(int i = 1;i < month;i++)
                countDay += getMonth(year, i);
            countDay += day;
            for(int i = year - 1;i > 2011;i--) {  //跳出循环时i = 2011
                if(judgeYear(i))
                    countDay += 366;
                else
                    countDay += 365;
            }
            countDay = countDay + 19 + 31;  //加上2011年11月份剩余天数和12月份31天
            result = 5 + countDay % 7;
            if(result != 7)
                result = result % 7;
        } else if(year < 2011){
            countDay = countDay + (getMonth(year, month) - day);
            month++;
            for(;month <= 12;month++)
                countDay += getMonth(year, month);
            for(int i = year + 1;i < 2011;i++) {  //跳出循环时i = 2011
                if(judgeYear(i))
                    countDay += 366;
                else
                    countDay += 365;
            }
            for(int i = 1;i <= 10;i++)
                countDay += getMonth(2011, i);
            countDay += 11;
            result = 5 - countDay % 7;
            if(result == 0)
                result = 7;
            else if(result == -1)
                result = 6;
            else if(result == -2)
                result = 5;
        } else if(year == 2011) {
            if(month > 11) {
                countDay = countDay + 19 + day;
            } else if(month == 11) {
                if(day >= 11) {
                    countDay = day - 11;
                } else if(day < 11)
                    countDay = 11 - day;
            } else if(month < 11) {
                countDay += getMonth(2011, month) - day;
                int i = month + 1;
                for(;i <= 10;i++)
                    countDay += getMonth(2011,i);
                countDay += 11;
            }
            if(month >= 11 && day >= 11) {
                result = 5 + countDay % 7;
                if(result != 7)
                    result = result % 7;
            } else {
                result = 5 - countDay % 7;
                if(result == 0)
                    result = 7;
                else if(result == -1)
                    result = 6;
                else if(result == -2)
                    result = 5;
            }
        }
        System.out.println(result);
    }

    public static void main(String[] args) {
        Main test = new Main();
        Scanner in = new Scanner(System.in);
        String date = in.nextLine();
        test.getResult(date);
    }
}
时间: 2024-10-05 23:52:47

算法笔记_154:算法提高 日期计算(Java)的相关文章

1502131514-蓝桥杯-算法提高 日期计算

算法提高 日期计算 时间限制:1.0s   内存限制:256.0MB 问题描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰,逢400年闰的情况. 输入格式 输入只有一行 YYYY MM DD 输出格式 输出只有一行 W 数据规模和约定 1599 <= YYYY <= 2999 1 <= MM <= 12 1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期 1 <= W &

蓝桥杯-算法提高-日期计算

算法提高 日期计算 时间限制:1.0s   内存限制:256.0MB 问题描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰,逢400年闰的情况. 输入格式 输入只有一行 YYYY MM DD 输出格式 输出只有一行 W 数据规模和约定 1599 <= YYYY <= 2999 1 <= MM <= 12 1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期 1 <= W &

算法笔记_155:算法提高 概率计算(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 生成n个∈[a,b]的随机整数,输出它们的和为x的概率. 输入格式 一行输入四个整数依次为n,a,b,x,用空格分隔. 输出格式 输出一行包含一个小数位和为x的概率,小数点后保留四位小数 样例输入 2 1 3 4 样例输出 0.3333 数据规模和约定 对于50%的数据,n≤5. 对于100%的数据,n≤100,b≤100. 2 解决方案 下面代码在系统中运行评分为90分,第五组数据无法通过,我用同版本的C代码运行(PS:具体参见文末

算法笔记_165:算法提高 道路和航路(Java)

目录 1 问题描述 2解决方案   1 问题描述 问题描述 农夫约翰正在针对一个新区域的牛奶配送合同进行研究.他打算分发牛奶到T个城镇(标号为1..T),这些城镇通过R条标号为(1..R)的道路和P条标号为(1..P)的航路相连. 每一条公路i或者航路i表示成连接城镇Ai(1<=A_i<=T)和Bi(1<=Bi<=T)代价为Ci.每一条公路,Ci的范围为0<=Ci<=10,000:由于奇怪的运营策略,每一条航路的Ci可能为负的,也就是-10,000<=Ci<

iOS学习笔记37-时间和日期计算

一.时间和日期计算 我们在应用开发中,时常需要和时间打交道,比如获取当前时间,获取两个时间点相隔的时间等等,在iOS开发中与时间相关的类有如下几个: 1. NSDate:表示一个绝对的时间点 2. NSTimeZone:时区信息 3. NSLocale:本地化信息 4. NSDateComponents:一个封装了具体年月日.时秒分.周.季度等的类 5. NSCalendar:日历类,它提供了大部分的日期计算接口 6. NSDateFormatter:用来在日期和字符串之间转换 二.NSDate

算法笔记_163:算法提高 最大乘积(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入格式 第一行一个数表示数据组数 每组输入数据共2行: 第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15, 第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4. 输出格式 每组数据输出1行,为最大的乘积. 样例输入 15 51 2 3 4 2 样例输出 48 2 解决方案 具体代码如下: import java.uti

算法笔记_166:算法提高 金属采集(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连,所有的节点和道路形成了一棵树.一共有 n 个节点,这些节点被编号为 1~n .人类将 k 个机器人送上了火星,目的是采集这些金属.这些机器人都被送到了一个指定的着落点, S 号节点.每个机器人在着落之后,必须沿着道路行走.当机器人到达一个节点时,它会采集这个节点蕴藏的所有金属矿.当机器人完成自己的任务之后,可以从任意一个节点返回地球

算法笔记_164:算法提高 最小方差生成树(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V,W,代表连接U,V的边,和权值W.保证图连通.n=m=0标志着测试文件的结束. 输出格式 对于每组数据,输出最小方差,四舍五入到0.01.输出格式按照样例. 样例输入 4 51 2 12 3 23 4 24 1 12 4 34 61 2 12 3 23 4 34 1 12 4 31 3 30 0 样

算法笔记_156:算法提高 6-17复数四则运算(Java)

目录 1 问题描述 2 解决方案   1 问题描述 设计复数库,实现基本的复数加减乘除运算. 输入时只需分别键入实部和虚部,以空格分割,两个复数之间用运算符分隔:输出时按a+bi的格式在屏幕上打印结果.参加样例输入和样例输出. 注意考虑特殊情况,无法计算时输出字符串"error". 样例输入 2 4 * -3 2 样例输出 -14-8i 样例输入 3 -2 + -1 3 样例输出 2+1i 2 解决方案 此题判断错误主要在除法运算上,除法运算有可能获得小数,所以在获取输入数字时,就得用