算法笔记3.4日期处理

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;
	}
}

    如果我是新手,如何才能想到问题的关键?

  • 重复读问题,想自己想的解决该问题的时候是如何想的?  
  • 例如,我自己想的时候便是数数。从一个日期出发,开始计数,直到碰见目标日期(日期相同)为止。
  • 立即从上面的想法推:
  1. 两个日期必有一大一小,实际输入的时候,一个把小的放在前面(time1),作为数数的基点。
  2. 两个日期不一样,一定是y或m或r的其中至少一个不一样。
  3. 只要日期不一样,立即将按规则将日期做累加。
  4. 故只要当前的y||m||d,与目标的y||m||d不一样,就把日期按规则累加。
  •  下面讨论累加规则(很简单,注意细节jiuok):
  1. 核心:当前你正在数的那个日期的d,再加一次,如果超过了这个日期所在的月份的d,就把月份进位。(如2.[28](d1)+1=3.1.(平年))
  2. 工具:二位数组。a[i][j]。为什么不用一维?因为平年和闰年的2月的日期有差别。
  3. 使用:由核心的说明可知,用i这个维度表示当前月,用j这个维度表示2月之间d的差别(j=0||1)。那么a[m][leap_year]的值就表示了当前的d。          




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值