南邮acm 1008 第N天 java解法

12 篇文章 0 订阅
10 篇文章 0 订阅

第几天

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:1701            测试通过:483

描述

在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。

给定公元2000年1月1日后的某年某月某日(包括2000年1月1日),你的任务:(1)给出这一天从公元2000年1月1日开始逝去的天数,(2)判断这一天是当年的第几天。

输入

输入包含若干行,每行包含三个空格间隔的正整数,它们分别表示年、月、日。输入最后一行是−1, 不必处理。可以假设结果的年份不会超过9999。

输出

多组,每组两行,分别为每行输入所代表的一天从公元2000年1月1日开始逝去的天数、在当年的第几天。

样例输入

2000 1 1
2009 3 14
-1

样例输出

0
1
3360
73

题目来源

NUPT


/**
	 * 第几天
	 * @param args
	 */
	public static void main(String[] args) {
		
		Scanner sc=new Scanner(System.in);
		while(sc.hasNextInt()){
			int year=sc.nextInt();
			if(year==-1)
				break;
			int month=sc.nextInt();
			int day=sc.nextInt();
			//System.out.println(year+"  "+month+"  "+day);
			fun2(year,month,day);
		}
	}


方法一:使用基本算法

/**
	 * 使用算法求解
	 * @param year
	 * @param month
	 * @param day
	 */
	private static void fun(int year, int month, int day) {//2000/1/1
		int totalDayForYear=0;//相隔的年数对应的天数
		/*int a=(year-2000)/4;//这里解法错了,因为闰年不一定每隔4年一次
		int b=(year-2000)%4;
		if(isRN(year)){
			totalDayForYear=a*(366+365*3);
		}else{
			totalDayForYear=a*(366+365*3)+366+365*(b-1);
		}*/
		for(int i=2000;i<year;i++){
			if(isRN(i)){
				totalDayForYear+=366;
			}else{
				totalDayForYear+=365;
			}
		}
		
		 //下面来求解这一天是在当年的第几天
		int[] dayByMonthForRN={0,31,29,31,30,31,30,31,31,30,31,30,31};
		int[] dayByMonthForPN={0,31,28,31,30,31,30,31,31,30,31,30,31};
		int totalDayInYear=0;
		if(isRN(year)){
			for(int i=1;i<month;i++){
				totalDayInYear+=dayByMonthForRN[i];
			}
		}else{
			for(int i=1;i<month;i++){
				totalDayInYear+=dayByMonthForPN[i];
			}
		}
		totalDayInYear+=day;
		
		System.out.println(totalDayForYear+totalDayInYear-1);
		System.out.println(totalDayInYear);

		
	}

	private static boolean isRN(int year) {
		if(year%100==0){
			if(year%400==0){
				return true;
			}
		}else{
			if(year%4==0){
				return true;
			}
		}
		return false;
	}

方法二:使用java提供的函数

/**
	 * 
	 * 使用java提供的函数求解
	 * @param year
	 * @param month
	 * @param day
	 */
	private static void fun2(int year, int month, int day) {
		String toDay = year+"-"+month+"-"+day;
		String fromDay="2000-1-1";
		String fromThisYearDay=year+"-1-1";
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		try {
			long toTime=sdf.parse(toDay).getTime();
			long fromTime=sdf.parse(fromDay).getTime();
			long fromThisYearTime=sdf.parse(fromThisYearDay).getTime();
			System.out.println((toTime-fromTime)/(24*60*60*1000));
			System.out.println((toTime-fromThisYearTime)/(24*60*60*1000)+1);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值