世界末日问题

曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。还有人称今后的某个世纪末的12月31日,如果是星期一则会。。。
有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!!
于是,“谣言制造商”又修改为星期日。。。。。。

1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即XX99年)的12月31日正好是星期天?请回答该年份(只填写这4位整数即可)

解法一:

public class Day01_EndOFWorld {public static void main(String[] args){/*Calendar提供了一个类方法getInstance用于获取Calendar对象,其日历字段已使用当前日期和时间初始化:*/Calendar calendar = Calendar.getInstance();//设置当前月份为12月,Calendar的MONTH从0开始计算,所以MONTH=11为12月calendar.set(Calendar.MONTH, 11);//设置当前天数为31日calendar.set(Calendar.DAY_OF_MONTH, 31);//循环体为从1999年开始的世纪迭代for(int year = 1999; year < 10000; year+=100){//设置当前年份为世纪末calendar.set(Calendar.YEAR, year);//若世纪末的年份的12月31日为星期天if(calendar.get(Calendar.DAY_OF_WEEK) == 1) //查表可知星期天的值是1{System.out.println(year);break;}}}
}
//[Out]:2299

解法二:

public class Day01_EndOFWorld2 {public static void main(String[] args) {int year = 1999;//年份为1999int day = 0;//此变量为天数累积量,作为判断是否跳出循环的语句的变量while (year<10000){//因为是从1999年到XX99年,中间有24个闰年,所以day自增36524day+=365*100+24;//如果有世纪闰年,则day++if ((year+1)%400==0)day++;year += 100;//因为1999年12月31日为星期五,所以day%7 == 2表示判断当天是否为周日if (day%7 == 2)break;}System.out.println(year);}
}
//[Out]:2299

知识链接:

Calendar类:

1)Calendar提供了一个类方法, getInstance ,用于获取这种类型的一般有用的对象。 Calendar的getInstance方法返回一个Calendar对象,其日历字段已使用当前日期和时间初始化:

 Calendar rightNow = Calendar.getInstance();

2)成员变量

成员变量 描述
ALL_STYLES 一个表示 getDisplayNames的样式说明符,表示所有样式的名称,如“1月”和“1月”。
AM AM_PM字段的值表示从午夜到中午之前的一天的时间。
AM_PM 对于get和 set指示是否 HOUR是前或中午之后。
APRIL MONTH 字段的值指示了公历和朱利安日历中的第四个月。 。
AUGUST MONTH 字段的值表示公历和朱利安日历中的第八个月。
DATE get和 set的字段编号,表示该月的日期。
DAY_OF_MONTH get字段编号和 set表示本月的日期。
DAY_OF_WEEK get字段编号和 set表示星期几。
DAY_OF_WEEK_IN_MONTH get和 set字段编号,表示当月的星期几的序数。
DAY_OF_YEAR get字段编号和 set表示 set的日数。
DECEMBER MONTH字段的值表示公历和朱利安日历中的第十二个月。
DST_OFFSET get字段编号和 set表示夏令时偏移量(以毫秒为单位)。
ERA get字段号和 set表示时代,例如,在儒略历中的AD或BC。
FEBRUARY MONTH 字段的值表示今年第二个月在公历和朱利安日历。
FIELD_COUNT 由 get和 set识别的不同字段的数量。
FRIDAY DAY_OF_WEEK 字段的值表示周五。
HOUR get和 set字段编号,表示上午或下午的小时。
HOUR_OF_DAY get和 set字段编号,表示当天的小时数。
isSet 说明是否设置日历的指定日历字段的标志。
isTimeSet 判断 time的值是否有效。
JANUARY MONTH领域的价值指示了公历和朱利安日历中的一年中的第一个月。
JULY MONTH领域的价值指示了公历和朱利安日历中的第七个月。
JUNE MONTH字段的值代表了公历和朱利安日历中的第六个月。
LONG 一个样式说明符 getDisplayName和 getDisplayNames相当于 LONG_FORMAT 。
LONG_FORMAT getDisplayName和 getDisplayNames的样式说明 符 ,表示用于格式的长名称。
LONG_STANDALONE 一个表示 getDisplayName和 getDisplayNames的样式说明 符 ,表示一个长名独立使用,如月份名称作为日历头。
MARCH MONTH字段的价值,表示今年第三个月在公历和朱利安日历。
MAY MONTH字段的价值显示了公历和朱利安日历中的第五个月。
MILLISECOND get字段编号和 set表示秒内的毫秒数。
MINUTE get字段编号和 set表示小时内的分钟。
MONDAY DAY_OF_WEEK字段的值表示星期一。
MONTH get和 set字段号表示该月。
NARROW_FORMAT 一个用于 getDisplayName和 getDisplayNames的样式说明 符 ,表示用于格式的窄名称。
NARROW_STANDALONE
NOVEMBER MONTH字段的值代表了公历和朱利安日历中的第十一个月。
OCTOBER MONTH字段的价值表示在公历和朱利安日历中的一年中的第十个月。
PM AM_PM字段的值表示从中午到午夜之前的一天中的一段时间。
SATURDAY DAY_OF_WEEK字段的值表示星期六。
SECOND get字段编号和 set表示分钟内的第二个。
SEPTEMBER MONTH字段的值代表了公历和朱利安日历中的第九个月。
SHORT 一个样式说明符 getDisplayName和 getDisplayNames相当于 SHORT_FORMAT 。
SHORT_FORMAT getDisplayName和 getDisplayNames的样式说明 符 ,表示用于格式的短名称。
SHORT_STANDALONE 一个 getDisplayName和 getDisplayNames的样式说明 符 ,表示一个简单的名称,例如一个月缩写作为日历头。
SUNDAY DAY_OF_WEEK字段的值表示星期天。
THURSDAY DAY_OF_WEEK字段的值表示周四。
TUESDAY DAY_OF_WEEK字段的值表示周二。
UNDECIMBER MONTH字段的值表示一年的第十三个月。
WEDNESDAY 价值 DAY_OF_WEEK字段表示周三。
WEEK_OF_MONTH get字段编号和 set表示 set的周数。
WEEK_OF_YEAR get字段编号和 set表示 set的周数。
YEAR get字段编号和 set表示年份。
ZONE_OFFSET get字段编号和 set表示以毫秒为单位的GMT的原始偏移量。

3)构造方法摘要

构造方法 描述
Calendar​() 构造具有默认时区和默认 FORMAT语言环境的日历。
Calendar​(TimeZone zone, Locale aLocale) 构造具有指定时区和区域设置的日历。

4)方法摘要

方法 描述
add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段。
after(Object when) 返回 Calendar是否表示在指定的 Object表示的时间之后的时间。
before(Object when) 返回此 Calendar是否表示由指定的 Object表示的时间之前的时间。
clear() 将所有的日历字段值和时间值(毫秒从偏移 Epoch如此) Calendar不确定。
clear(int field) 设置给定日历字段值和时间值(毫秒从偏移 Epoch如此) Calendar不确定。
clone() 创建并返回此对象的副本。
compareTo(Calendar anotherCalendar) 比较由两个 Calendar对象表示的时间值( Epoch的毫秒偏移量)。
complete() 填写日历字段中的任何未设置的字段。
computeFields() 当前毫秒时间值转换为 time的日历字段值 fields[] 。
computeTime() 将 fields[]中的当前日历字段值 转换为毫秒时间值 time 。
equals(Object obj) 将此 Calendar与指定的 Object 。
get(int field) 返回给定日历字段的值。
getActualMaximum(int field) 给定此 Calendar的时间值,返回指定日历字段可能具有的 Calendar 。
getActualMinimum(int field) 给定此 Calendar的时间值,返回指定日历字段可能具有的 Calendar 。
getAvailableCalendarTypes() 返回一个不可修改的 Set其中包含 Calendar在运行时环境中支持的所有日历类型。
getAvailableLocales() 返回一个所有语言环境的数组,该类的 getInstance方法可以返回本地化实例。
getCalendarType() 返回此 Calendar的日历类型。
getDisplayName(int field, int style, Locale locale) 返回给定的 style和 locale中的日历 field的字符串表示。
getDisplayNames(int field, int style, Locale locale) 返回一个 Map其中包含给定的 style和 locale中的日历 field所有名称及其对应的字段值。
getFirstDayOfWeek() 得到一周的第一天是什么 例如, SUNDAY在美国, MONDAY在法国。
getGreatestMinimum(int field) 返回此 Calendar实例的给定日历字段的最高最小值。
getInstance() 使用默认时区和区域设置获取日历。
getInstance(Locale aLocale) 使用默认时区和指定的区域设置获取日历。
getInstance(TimeZone zone) 使用指定的时区和默认语言环境获取日历。
getInstance(TimeZone zone, Locale aLocale) 获取具有指定时区和区域设置的日历。
getLeastMaximum(int field) 返回此 Calendar实例的给定日历字段的最低最大值。
getMaximum(int field) 返回此 Calendar实例的给定日历字段的 Calendar 。
getMinimalDaysInFirstWeek() 获得一年中第一周所需的最低限度的日子; 例如,如果第一周被定义为包含一年中的第一个月的第一个星期,则此方法返回1。
getMinimum(int field) 返回此 Calendar实例的给定日历字段的 Calendar 。
getTimeInMillis() 以毫秒为单位返回此日历的时间值。
getTimeZone() 获取时区。
getWeeksInWeekYear() 返回此 Calendar代表的星期内的星期 Calendar 。
getWeekYear() 返回此 Calendar代表的 Calendar 。
hashCode() 返回此日历的哈希码。
internalGet(int field) 返回给定日历字段的值。
isLenient() 告诉日期/时间的解释是否宽松。
isSet(int field) 确定给定的日历字段是否具有值集,包括通过 get方法调用触发的内部字段计算设置的值的情况。
isWeekDateSupported() 是否返回 Calendar是否支持星期。
roll(int field, boolean up) 在给定时间字段上添加或减少单个时间单位,而不改变较大的字段。
roll(int field, int amount) 将指定(签名)金额添加到指定的日历字段,而不更改较大的字段。
set(int field, int value) 将给定的日历字段设置为给定的值。
set(int year, int month, int date) 设置日历字段的值 YEAR , MONTH ,并 DAY_OF_MONTH 。
set(int year, int month, int date, int hourOfDay, int minute) 设置日历字段的值 YEAR , MONTH , DAY_OF_MONTH ,
set(int year, int month, int date, int hourOfDay, int minute, int second) 设置字段中的值 YEAR , MONTH , DAY_OF_MONTH , HOUR_OF_DAY , MINUTE ,并 SECOND 。
setFirstDayOfWeek(int value) 设置一周的第一天是什么? 例如, SUNDAY在美国, MONDAY在法国。
setLenient(boolean lenient) 指定日期/时间解释是否宽松。
setMinimalDaysInFirstWeek(int value) 设定一年中第一个星期所需的最短时间是多少? 例如,如果第一周被定义为包含一年中第一个月的第一天的第一周,请调用此值为1的方法。
setTime(Date date) 使用给定的 Date设置此日历的时间。
setTimeInMillis(long millis) 从给定的长值设置此日历的当前时间。
setTimeZone(TimeZone value) 以给定的时区值设置时区。
setWeekDate(int weekYear, int weekOfYear, int dayOfWeek) 设置这个 Calendar的日期与给定的日期说明符 - 周年,年周和星期几。
toInstant() 将此对象转换为Instant 。
toString() 返回此日历的字符串表示形式。

文章原创公众号:吐噜

备战蓝桥 Day01 | 世界末日问题相关推荐

  1. 蓝桥杯(世界末日题)

    题目要求: 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如果是星期一则会- 有趣的是,任何一个世纪末的年份的12月31日都不可能是星期 ...

  2. 蓝桥杯 世纪末的星期(世界末日)

    题目要求: 曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. 还有人称今后的某个世纪末的12月31日,如果是星期一则会.... 有趣的是,任何一个世纪末的年份的12月31日都不可能 ...

  3. 蓝桥杯2013Java组省赛(世界末日)

    //曾有邪教称1999年12月31日是世界末日.当然该谣言已经不攻自破. //还有人称今后的某个世纪末的12月31日,如果是星期一则会- //有趣的是,任何一个世纪末的年份的12月31日都不可能是星期 ...

  4. 蓝桥杯比赛常考算法_备战蓝桥--算法竞赛入门第一章总结

    笔者备战蓝桥杯先打算看完<算法竞赛入门经典>第2版,在这里写下第一章的笔记,供自己和大家参考. 鸡兔同笼问题 原题: 已知鸡和兔的总数量为n,总腿数为m.输入n和m,依次输出鸡的数目和兔的 ...

  5. NYOJ 636 世界末日

    世界末日 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 世界末日马上就要来临了,当然,每个人都想买到船票,但是由于船票有限,因此需要回答对一个问题才能买票.问题是这样的 ...

  6. 7天备战蓝桥杯之第一天

    7天备战蓝桥杯之第一天 0x1 前言 ​ 无尔,只为打脸某人.(ps.本来不想玩,谁叫某人喜欢嘲笑我是个垃圾呢,mmp,没错我就是个垃圾,我最tm讨厌说实话的人了) 0x2 备战思路 ​ 以我多年的考 ...

  7. 物理学家张首晟:如果世界末日来临,我会带这几句话上诺亚方舟|研习社演讲实录...

    4月9日,著名物理学家.斯坦福大学教授张首晟教授在混沌研习社,分享了<第一性原理与创业>. 张首晟说,千年思想,最最精华的都是大道至简,你看宇宙美妙在哪儿?E=MC²这样一个公式,能够描写 ...

  8. 备战蓝桥杯—有边数限制的最短路 (bellman_ford+)——[AcWing]有边数限制的最短路

    因为近期在学图,所以顺带的写一篇最短路的备战蓝桥杯文章. 最短路(单源) 所有边权都为正数有两种算法: 1.朴素Dijkstra    O(n^2) 2.堆优化的Dijkstra    O(mlogn ...

  9. 备战蓝桥杯—枚举——[USACO Nov08]成交

    农夫 John 余下了 m 批干草无法处理,他准备要开一个拍卖会去出售他的干草.现在有 n 个顾客,每个顾客的报价是 ai​.现在 John 要确定一个单价,所有报价大于等于单价的顾客将会买到 1批干 ...

最新文章

  1. 一.Timesten安装
  2. 一文看懂 AI 训练集、验证集、测试集(附:分割方法+交叉验证)
  3. 基于Http替补新闻WebService数据交换
  4. 扩展正则表达式egrep11
  5. SHELL中使用sed替换文本
  6. [成功] vscode使用微软编译器 vs编译器
  7. 速度上车,全网无损音乐,付费内容任你免费下载
  8. Linux中编译mdio命令,linux网络设备—mdio总线
  9. 一文了解常用效率记笔记软件(超过20款含有图片和双向链笔记)
  10. 汽车电子设计之SBC芯片简单认识
  11. Squid安装及运行控制_wuli大世界_新浪博客
  12. 佳能相机G7 Mark Ⅱ (测光与对焦)
  13. perl社工密码字典生成器
  14. OpenXML指定位置插入图片
  15. 内存取证之Volatility ——合天网安实验室学习笔记
  16. Photoshop CC 2019 软件安装教程
  17. 跨考计算机 经验,跨考计算机成功的“重要”经验_跨考网
  18. 傅里叶逆变换程序matlab,按时间抽取基2-快速傅里叶逆变换算法_MATLAB代码
  19. VMware安装树莓派(一)
  20. Oracle_1th_查询语句

热门文章

  1. matlab 局域态密度电子密度的可视化程序
  2. 设计原则:面向对象设计原则详解
  3. 解决Word中MathType公式与文字对齐问题
  4. Linux性能排查——系统中出现大量不可中断进程和僵尸进程排查
  5. 进化论真的合理吗?换个角度看进化论(一)
  6. 用苹果手机拍照,这5个功能要了解,不然手机真的白买了
  7. 爬取豆瓣电影TOP250的所有电影名称,网址为:https://movie.douban.com/top250
  8. Java中的内存溢出和内存泄漏
  9. PHP实现邮件自动发送
  10. 创建自定义AlertDialog