算法题:输入年月日,输出该日期是当年的多少天

因为题目要求参数只能使用int,所以这里不讨论Java的日期特性.

思路分析:

    首先闰年的年份2月为29天,平年2月为28天,所以要先判断输入的年份是闰年还是平年,判断方式是:如果年份能够被4整除但不能被100整除,或者年份能被400整除,二者满足其一则为闰年,否则为平年,然后算出输入月份-1的总天数加上当前月份的天数,即得到结果。

代码分析:

   如果完全使用if判断,判断当前年,在判断当前月计算的话,未免太繁琐,这里我们可以预先把闰年和平年每月的天数保存到数组中,循环遍历,代码就会精简很多。

 

public int getdate(int year,int month,int day){
		int[] leapYear = {31,29,31,30,31,30,31,31,30,31,30,31};
		int[] GapYear = {31,28,31,30,31,30,31,31,30,31,30,31};
		boolean isLeapYear = false;
		int dayNum = day;
		if(year<=0||month<=0||month>12||day<=0||day>31){
			return 0;
		}
		if((year%4==0&&year%100!=0)||year%400==0){
			isLeapYear = true;
		}
		for(int i=0;i<month-1;i++){
			if(isLeapYear){
				dayNum=dayNum+leapYear[i];
			}else{
				dayNum=dayNum+GapYear[i];
			}
		}
		return dayNum;
	}

另外还有一种方式,可以先按平年将前n-1个月份的的总天数算出来,采用switch case来判断当前月份,得到天数,加上当前天数,最后判断月份是否大于2,如果是,在判断是否为闰年,如果为闰年则+1天,否则就只加上当前月的天数。参考代码如下:

public  int getdate2(int year,int month,int day){
		int sum=0;
		boolean isLeapYear = false;
		if(year<=0||month<=0||month>12||day<=0||day>31){
			return 0;
		}
		if((year%4==0&&year%100!=0)||year%400==0){
			isLeapYear = true;
		}
		switch (month) {
		case 1:
			sum=0;
			break;
		case 2:
			sum=31;
			break;
		case 3:
			sum=31+28;
			break;
		case 4:
			sum=31+28+31;
			break;
		case 5:
			sum=31+28+31+30;
			break;
		case 6:
			sum=31+28+31+30+31;
			break;
		case 7:
			sum=31+28+31+30+31+30;
			break;
		case 8:
			sum=31+28+31+30+31+30+31;
			break;
		case 9:
			sum=31+28+31+30+31+30+31+31;
			break;
		case 10:
			sum=31+28+31+30+31+30+31+31+30;
			break;
		case 11:
			sum=31+28+31+30+31+30+31+31+30+31;
			break;
		case 12:
			sum=31+28+31+30+31+30+31+31+30+31+30;
			break;
		default:
			System.out.println("请输入正确的月份.");
		}
		if(month>2){
			if(isLeapYear){
				sum=sum+day+1;
			}else{
				sum=sum+day;
			}
		}else{
			sum=sum+day;
		}
		return sum;
	}

以上为自己学习记录,有问题的地方欢迎大家讨论指正。

点赞