您的位置:首页 > 其它

算法笔记3.4日期处理

2018-04-04 17:44 323 查看
package 日期处理;
/*
* 有两个日期,求这两个日期间的 天数。[注]:如果两个日期是连续的,则规定他们之间的天数为两天。
* 如,输入:  20130101   20130105
* 输入格式: yyyymmdd
* 输出      5
*/
import java.util.*;
public class Text {
public static void main(String[] args){
//输入日期
/*
int time1=new Scanner(System.in).nextInt();
int time2=new Scanner(System.in).nextInt();
*/
//做测试
int time1=20131001,time2=20131005;
//分大小
if(time1>time2){int temp=time1;time1=time2;time2=temp;}
//取日期
int y1=time1/10000,m1=time1/100%100,d1=time1%100;
int y2=time2/10000,m2=time2/100%100,d2=time2%100;
//定规则
int a[][]={{0,1},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},
{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};

int count=1;//看[注]。

//问题本身
while(d1<d2||m1<m2||y1<y2){
d1++;
if(d1==a[m1][leap_year(y1)]+1){
m1++;d1=1;
}
if(m1==13){
y1++;m1=1;
}
count++;
}
System.out.println("日期差为:"+count);
}
//判润年
public static int leap_year(int y1){
if((y1%100!=0&&y1%4==0)||y1%400==0)
return 1;
return 0;
}
}
    如果我是新手,如何才能想到问题的关键?重复读问题,想自己想的解决该问题的时候是如何想的?  
例如,我自己想的时候便是数数。从一个日期出发,开始计数,直到碰见目标日期(日期相同)为止。
立即从上面的想法推:
两个日期必有一大一小,实际输入的时候,一个把小的放在前面(time1),作为数数的基点。
两个日期不一样,一定是y或m或r的其中至少一个不一样。
只要日期不一样,立即将按规则将日期做累加。
故只要当前的y||m||d,与目标的y||m||d不一样,就把日期按规则累加。
 下面讨论累加规则(很简单,注意细节jiuok):
核心:当前你正在数的那个日期的d,再加一次,如果超过了这个日期所在的月份的d,就把月份进位。(如2.[28](d1)+1=3.1.(平年))
工具:二位数组。a[i][j]。为什么不用一维?因为平年和闰年的2月的日期有差别。
使用:由核心的说明可知,用i这个维度表示当前月,用j这个维度表示2月之间d的差别(j=0||1)。那么a[m][leap_year]的值就表示了当前的d。          
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: