游客 Signup | Login
中文 | En

1503 - 日期差值

通过次数

0

提交次数

0

Time Limit : 1 秒 Memory Limit : 32 MB

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

Input

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

Output

每组数据输出一行,即日期差值

Examples

Input Format

20130101
20130105

Output Format

5

Solution C

#include <stdio.h>
#include <math.h>

int m[][2]={0,0,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 leap(int year)
{
  return((year%4==0&&year%100!=0)||(year%400==0));
}

int day(int year,int month,int day)
{
  int d=0;
  int k=0;
    int i;
	  if(leap(year))
    k=1;
  for(i=1;i<month;i++)
    d+=m[i][k];
  d+=day;
  return(d);
}
main()
{
  int y1,y2,m1,m2,d1,d2,day1,day2,i;
  while(scanf("%4d%2d%2d",&y1,&m1,&d1)!=EOF)
  {
	  scanf("%4d%2d%2d",&y2,&m2,&d2);
	  day1=day(y1,m1,d1);
	  day2=day(y2,m2,d2);
	  for(i=0;i<y1;i++)
	  {
		  if(leap(i))
			  day1+=366;
		  else
			  day1+=365;
	  }
	   for(i=0;i<y2;i++)
	  {
		  if(leap(i))
			  day2+=366;
		  else
			  day2+=365;
	  }
	   printf("%d\n",(int)fabs(day1-day2)+1);
  }
}

Solution C++

#include<stdio.h>
#include<math.h>

int m[13][2]={0,0,
			  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 leap(int y)
{
	return (y%4==0&&y%100!=0)||(y%400==0);
}

int day(int Y,int M,int D)
{
	int k=0,i,d;
	if(leap(Y))
		k=1;
	for(d=0,i=1;i<M;i++)
		d+=m[i][k];
	d+=D;
	return d;
}

int main()
{
	int Y1,M1,D1,Y2,M2,D2,i,d1,d2;
	while(scanf("%4d%2d%2d",&Y1,&M1,&D1)!=EOF)
	{
		scanf("%4d%2d%2d",&Y2,&M2,&D2);
		d1=day(Y1,M1,D1);
		d2=day(Y2,M2,D2);
		for(i=0;i<Y1;i++)
			if(leap(i))
				d1+=366;
			else
				d1+=365;
		for(i=0;i<Y2;i++)
			if(leap(i))
				d2+=366;
			else
				d2+=365;
		printf("%d\n",(int)fabs(d1-d2)+1);
	}
	return 0;
}

Solution Java

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int[][] month = {{0,0}, {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 time1, y1, m1, d1;
		int time2, y2, m2, d2;
		while (in.hasNext()) {
			time1 = in.nextInt(); time2 = in.nextInt();
			if (time1 > time2) {
				int temp = time1;
				time1 = time2;
				time2 = temp;
			}
			y1 = time1/10000; m1 = time1%10000/100; d1 = time1%100;
			y2 = time2/10000; m2 = time2%10000/100; d2 = time2%100;
			int ans = 1;
			while (y1<y2 || m1<m2 || d1<d2) {
				d1++;
				if (d1 == month[m1][isLeap(y1)]+1) {
					m1++;
					d1 = 1;
				}
				if (m1 == 13) {
					y1++;
					m1 = 1;
				}
				ans++;
			}
			System.out.println(ans);
		}
	}
	static int isLeap(int year) {
		if ((year%4 == 0 && year%100 != 0)||(year%400 == 0)) return 1;
		else return 0;
	}
}

Solution Python

# coding=utf-8


months=[31,28,31,30,31,30,31,31,30,31,30,31]
months1=[31,29,31,30,31,30,31,31,30,31,30,31]

def leap(year):
	return ((year %4 ==0) and (year % 100 != 0)) or (year % 400 == 0)
def calc():
	date1 = int(input())
	date2 = int(input())
	if date1 == None or date2 == None:
		exit()
	if date1>date2:
		tmp = date1
		date1 = date2
		date2 = tmp
	y1 = date1//10000
	y2 = date2//10000
	m1 = date1 % 10000 // 100
	m2 = date2 % 10000 // 100
	d1 = date1 % 100
	d2 = date2 % 100

	res = 1
	while (y1 < y2-1):
		if(leap(y1)): res += 366 
		else: res += 365
		y1+=1

	if y1 != y2:
		if(leap(y1)): 
			res += sum(months1[m1:])
			res += months1[m1-1] - d1
		else:  
			res += sum(months[m1:])
			res += months[m1-1] - d1
		if(leap(y2)): 
			res += sum(months1[:m2-1])
		else:  
			res += sum(months[:m2-1])
	else:
		if (m1 != m2):
			if(leap(y1)): 
				res +=sum(months1[m1:m2-1])
				res += months1[m1-1]-d1
			else:
				res += sum(months[m1:m2-1])
				res += months[m1-1]-d1
		else:
			res -= d1
	res +=d2
	print(res)

while True:
	calc()