首页 新闻 会员 周边 捐助

JAVA算法题

0
悬赏园豆:5 [已解决问题] 解决于 2014-11-14 10:59

题目标题: 高斯日记

大数学家高斯有个好习惯:无论如何都要记日记。

他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210

后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?

高斯出生于:1777年4月30日。

在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。

高斯获得博士学位的那天日记上标着:8113

请你算出高斯获得博士学位的年月日。

提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21

 

求注释本图片的代码,尽量详细,谢谢!

爱编程1314的主页 爱编程1314 | 初学一级 | 园豆:26
提问于:2014-11-13 22:59
< >
分享
最佳答案
0
 1     public static void main(String[] args) {
 2         // 记录每月有多少天,数组脚标从0开始,因此第一位用0占位。
 3         // 除了二月份是28天或29天不确定,其余月份有多少天都已经确定。
 4         //         占位  一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月
 5         int m[] = { 0,   31, 28,  31, 30, 31,  30,  31, 31, 30,  31,  30,   31 };
 6         
 7         // 高斯出生日期,1777年4月30日。
 8         int year = 1777, mon = 4, day = 30;
 9         
10         // 天数n = 8113 + 生日中的天数 - 出生当天。
11         int n = 8113 + day - 1;
12         
13         // 从1777年4月1日开始推算,过了n天,当前日期是多少。
14         
15         // 当n的天数,大于当前遍历月的天数时,说明当前月份还可以增加。
16         // 直到n的天数不足一月的时候,那么n的值就是当前日期中的日的值。
17         while (n > m[mon]) {
18             // n - 当前遍历月份的天数
19             n -= m[mon]; // 相当于 n = n - m[mon];
20             // 先将月份加一,但是月份不能超过12,所以和13取余运算,保证月份不超过12。
21             mon = ++mon % 13;// 相当于mon++; mon = mon % 13;
22             // 如果是一月份了,说明又过了一年
23             if (mon == 1) {
24                 // 年份加一
25                 year++;
26                 // 如果是闰年
27                 if (run(year)) {
28                     // 二月有29天
29                     m[2] = 29;
30                 } else { // 不是闰年
31                     // 二月有28天
32                     m[2] = 28;
33                 }
34             }
35         }
36         // 输出年月日。中间的0是为了保证输出形如:1777-04-30的效果。这种做法不正确。
37         System.out.println(year + "" + 0 + mon + "-" + n);
38     }
39 
40     /**
41      * 判断是否为闰年
42      * @param y 年
43      * @return
44      */
45     private static boolean run(int y) {
46         // 满足如下两种情况其中一种,则是闰年:
47         // 1.能被4整除,且不能被100整除。
48         // 2.能被400整除。
49         if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
50             return true;
51         }
52         return false;
53     }
收获园豆:5
巧克力键盘 | 菜鸟二级 |园豆:207 | 2014-11-14 10:01
1     public static void main(String[] args) {
2         Calendar calendar = Calendar.getInstance();
3         calendar.set(1777, 4-1, 30);
4         Date date = calendar.getTime();
5         date = DateUtils.addDays(date, 8113);
6         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
7         String dateStr = sdf.format(date);
8         System.out.println(dateStr);// 1799-07-17
9     }

 

巧克力键盘 | 园豆:207 (菜鸟二级) | 2014-11-14 10:57

嗯,注释很清楚,可算弄明白是怎么回事了,谢谢你!

爱编程1314 | 园豆:26 (初学一级) | 2014-11-14 10:59

@爱编程1314: 提个建议啊,下次提问题记得贴代码,别贴图片。

巧克力键盘 | 园豆:207 (菜鸟二级) | 2014-11-14 11:02

@巧克力键盘: 呵呵,我知道您老人家手打有点累,辛苦了,下次一定贴代码!

爱编程1314 | 园豆:26 (初学一级) | 2014-11-14 11:04

@巧克力键盘: 你下面那段代码是什么意思啊,我粘贴复制提示有错误啊,是不是没贴完全啊

爱编程1314 | 园豆:26 (初学一级) | 2014-11-14 11:06

@爱编程1314: 评论中的代码是这道题的简便算法,使用了开源工具类DateUtils。如果没有导入包,是会报错的。等你以后系统了学习之后,再使用吧。

巧克力键盘 | 园豆:207 (菜鸟二级) | 2014-11-14 11:08

@巧克力键盘: 嗯,好的,我会好好学的。都说博客园里都是深山老林的高人,呵呵!

爱编程1314 | 园豆:26 (初学一级) | 2014-11-14 11:16
其他回答(1)
0

好一个java入门人

gltide | 园豆:403 (菜鸟二级) | 2014-11-14 10:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册