#include<stdio.h> #define leap(x) (x%400==0||(x%4==0&&x%100!=0)?1:0) #define Abs(x) ((x)>0?(x):-(x)) typedef struct date { int y, m, d; }Date; const int yd[2][13]={{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; int days(Date x) { int sum=0, i; int y=x.y, m=x.m, d=x.d; for(i=0; i<y; i++) { if(leap(i)) { sum+=366; } else { sum+=365; } } for(i=1; i<m; i++) { sum+=yd[leap(y)][i]; } sum+=d; return sum; } int main(void) { Date a, b; while(scanf("%4d%2d%2d", &a.y, &a.m, &a.d)!=EOF) { scanf("%4d%2d%2d", &b.y, &b.m, &b.d); printf("%d\n", Abs(days(a)-days(b))+1); } return 0; }
//计算两个日期距离0000年0月1日的天数再求差
#include <bits/stdc++.h>
using namespace std;
int mon[12]={0,31,59,90,120,151,181,212,243,273,304,334};//字典
int cal(int y,int m,int d)//给出年月日,计算距离0000年0月1日的天数和
{
return y*365+y/4-y/100+y/400+mon[m-1]+d-1+(y/100!=0&&y/4==0||y/400==0&&m>2);
}
int main()
{
int x[2],year,month,day;
for(int k=0;k<2;k++)//循环两次读入两个日期
{
scanf("%4d%2d%2d",&year,&month,&day);
x[k]=cal(year,month,day);
}
cout<<abs(x[0]-x[1])+1;
}
#include<bits/stdc++.h> using namespace std; const int month[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31 } }; bool leapyear(int y) { if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) return true; else return false; } int numofyear(int y) { if (leapyear(y)) return 366; else return 365; } int sumofdate(int y, int m, int d) { int sum = 0; for (int i = 0; i < y; i++) { sum += numofyear(i); } for (int i = 0; i < m; i++) { sum += month[leapyear(y)][i]; } sum += d; return sum; } int main() { int y1, m1, d1, y2, m2, d2; while (scanf("%04d%02d%02d", &y1, &m1, &d1) != EOF) { scanf("%04d%02d%02d", &y2, &m2, &d2); printf("%d\n", abs(sumofdate(y1, m1, d1)-sumofdate(y2, m2, d2))+1); } return 0; }
#include<iostream> #include<cstdio> #include<string> #include<algorithm> using namespace std; int tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}; bool leapyear(int year) { return (year%4==0&&year%100!=0)||(year%400==0); } int numberofyear(int year) { if(leapyear(year)) return 366; else return 365; } int main() { char s1[9]; char s2[9]; while(cin>>s1>>s2) { int year1,year2,month1,month2,day1,day2; int num1=0; int num2=0; sscanf(s1,"%4d%2d%2d",&year1,&month1,&day1); sscanf(s2,"%4d%2d%2d",&year2,&month2,&day2); for(int i=0;i<year1;i++) { num1+=numberofyear(i); } for(int j=0;j<month1;j++) { num1+=tab[leapyear(year1)][j]; } num1+=day1; for(int i=0;i<year2;i++) { num2+=numberofyear(i); } for(int j=0;j<month2;j++) { num2+=tab[leapyear(year2)][j]; } num2+=day2; int num=abs(num2-num1)+1; cout<<num<<endl; } }
import java.time.LocalDate; import java.time.temporal.ChronoUnit; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()){ LocalDate date1 = getDate(scanner.next()); LocalDate date2 = getDate(scanner.next()); System.out.println(date1.until(date2, ChronoUnit.DAYS)+1); } } static LocalDate getDate(String s){ String year = s.substring(0, 4); String month = s.substring(4, 6); String day = s.substring(6); return LocalDate.of(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day)); } }
#include<stdio.h> #define isyear(x) x%10!=0&&x%4==0||x%400==0?1:0 int dom[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, }; typedef struct data { int year; int month; int day; void addday() { day++; if(day>dom[month][isyear(year)]) { day=1; month++; if(month>12) { month=1; year++; } } } }data; int buf[5000][13][31]={0}; int ABS(int a){return a<0?-a:a;} int main() { int cnt=0; data tem; tem.year=0; tem.month=1; tem.day=1; while(tem.year!=5000) { tem.addday(); cnt++; buf[tem.year][tem.month][tem.day]=cnt; } int y1,m1,d1; int y2,m2,d2; while(scanf("%4d%2d%2d",&y1,&m1,&d1)!=EOF) { scanf("%4d%2d%2d",&y2,&m2,&d2); printf("%d",ABS(buf[y1][m1][d1]-buf[y2][m2][d2])+1); } return 0; }
思路:
将小的日期记为A,大的日期记为B
计算 A年的 1.1 (A11) 到B年1.1 (B11)的天数 A11toB11 (记得计算闰年)
计算 A到本年的日期 Ato11
计算 B到本年的日期 Bto11
日期差值为
A11toB11 + Bto11 - Ato11
代码如下:
#include
#include
#include
using namespace std;
int beginDayOfMonth[13][2] = {
0, 0,
0, 0,
31, 31,
59, 60,
90, 91,
120, 121,
151, 152,
181, 182,
212, 213,
243, 244,
273, 274,
304, 305,
334, 335
};
int isRunYear(int year)
{
return year%100 != 0 && year%4 == 0 || year%400 == 0 ? 1:0;
}
int dayto11(int year, int month, int day)
{
int isRun = isRunYear(year);
if(isRun)
{
return day + beginDayOfMonth[month][1];
}
else return day + beginDayOfMonth[month][0];
// return day + beginDayOfMonth[month][isRun]; 但这里需要保证 isRun 只取 01
}
int main()
{
int AtoA11, BtoB11, A11toB11;
int y1, m1, d1;
int y2, m2, d2;
int disDay;
while(scanf("%4d%2d%2d", &y1, &m1, &d1) != EOF)
{
scanf("%4d%2d%2d", &y2, &m2, &d2);
if(y1 > y2 || (y1 == y2 && m1 > m2) || (y1 == y2 && m1 == m2 && d1 > d2))
{
int tmp = y1;
y1 = y2;
y2 = tmp;
tmp = m1;
m1 = m2;
m2 = tmp;
tmp = d1;
d1 = d2;
d2 = tmp;
}
AtoA11 = dayto11(y1, m1, d1);
BtoB11 = dayto11(y2, m2, d2);
// cout << AtoA11 << endl;
// cout << BtoB11 << endl;
A11toB11 = 0;
for(int i = y1; i < y2; i++)
{
if(isRunYear(i)) A11toB11 += 366;
else A11toB11 += 365;
}
disDay = A11toB11 + BtoB11 - AtoA11 + 1; // 这里是 把 最后一天的也给算上
printf("%d\n", disDay);
}
return 0;
}
思路二
主要参考“看不见的风景201803281904”。
这里我对计算距离0年1月1日的方法进行了修改,
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int mon[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
int sumRun1(int y)
{
// 计算[0, y]之间 闰年 的次数
// 若 y在 0000 年之前, 则为负数,记录了[y, -1]闰年的次数(的相反数)
return 1 + floor(double(y-1)/4+1e-4) - floor(double(y-1)/100+1e-4) + floor(double(y-1)/400+1e-4);
// y-1是因为如果 第y年是闰年,那么会对 00000101至 y+1年1月1日 的天数造成影响
// +1 是为了 将0000年记为闰年
// floor(double(y-1)/4+1e-4) 是为了 计算在公元前的闰年
// + 1e-4 是为了避免浮点误差
/*
其实这段代码的效果就是为了对应
年数
-5 -4 -3 -2 -1 0 1 2 3 4 5 6
累计闰年个数
-1 -1 0 0 0 0 1 1 1 1 2 2
*/
}
int isRunYear(int year)
{
return year%100 != 0 && year%4 == 0 || year%400 == 0 ? 1:0;
}
int sumRun2(int y) // 和这个效果是一样的
{
int numOfRun = 0;
if(y < 0)
{
for(int i = y; i < 0; i++)
{
if(isRunYear(i)) numOfRun--;
}
}
else
{
for(int i = 0; i < y; i++)
{
if(isRunYear(i)) numOfRun++;
}
}
return numOfRun;
}
// 给出年月日,计算距离0000年 1 月 1 日的 天数
int calto01(int y, int m, int d)
{
return sumRun1(y) + y * 365 + mon[m-1] + d-1 + (((y%100 != 0 && y%4 == 0) || y%400 == 0) && m > 2);
}
int main()
{
int disto01[2], year, month, day;
int y0, m0, d0;
int y1, m1, d1;
while(scanf("%4d%2d%2d", &y0, &m0, &d0) != EOF)
{
scanf("%4d%2d%2d", &y1, &m1, &d1);
disto01[0] = calto01(y0, m0, d0);
disto01[1] = calto01(y1, m1, d1);
// cout << disto01[0] << " " << disto01[1] << endl;
printf("%d\n", abs(disto01[0] - disto01[1]) + 1);
}
return 0;
}
#include<iostream> #include<string> #include<vector> #include<cmath> #include<algorithm> using namespace std; int bijiao(int y1,int m1,int d1,int y2,int m2,int d2){ //比较日期大小 if(y1>y2) return 1; else if((y1==y2)&&(m1>m2)) return 1; else if((y1==y2)&&(m1==m2)&&(d1>d2)) return 1; return 0; } int runnian(int a){ //判断是否是闰年 if((a%400==0)||(a%100!=0&&a%4==0)) return 1; return 0; } int main(){ long int a,b; cin>>a>>b; int s1[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int s2[12]={31,29,31,30,31,30,31,31,30,31,30,31}; int y1=a/10000; int y2=b/10000; int m1=a/100%100; int m2=b/100%100; int d1=a%100; int d2=b%100; int k=0; if(bijiao(y1,m1,d1,y2,m2,d2)==0){ //总是让y1对应的时间是最晚的 swap(y1,y2); swap(m1,m2); swap(d1,d2); } while(y1!=y2||m1!=m2||d1!=d2){ //一天一天往上增加,直到等于最晚的时间 if(runnian(y2)){ //若是闰年则使用数组s2,否则s1 if((d2+1)>s2[m2-1]){ //d2增加一天,判断是否超出月份 if(m2+1>12){ //超出月份则月份加一,判断是否过了12月 y2++; //超过12月则年份加一,时间归1 m2=1; d2=1; } else { //若没有超过年份,则月份加1,天数变为1; m2++; d2=1; } } else { //若是没有超过月份,则天数加一 d2++; } } else { //不是闰年,进行相同操作 if((d2+1)>s1[m2-1]){ if(m2+1>12){ y2++; m2=1; d2=1; } else { m2++; d2=1; } } else { d2++; } } k++;//每次天数加一后,K++ } cout<<++k; //最后输出要增加一天 }
分别对年月日进行差值计算累加天数
#coding : utf-8
year = [365, 366]
month = [[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]]
def isRun(y):
if y%400==0 or (y%100!=0 and y%4==0):
return 1
return 0
def count(y1, m1, d1, y2, m2, d2):
cnt = 0
for y in xrange(y1, y2):
cnt+=year[isRun(y)]
y2_isRun = isRun(y2)
for m in xrange(m1, m2):
cnt+=month[y2_isRun][m-1]
return cnt+d2-d1+1
while True:
try:
date1 = raw_input().strip()
date2 = raw_input().strip()
y1 = int(date1[0:4])
y2 = int(date2[0:4])
m1 = int(date1[4:6])
m2 = int(date2[4:6])
d1 = int(date1[6:8])
d2 = int(date2[6:8])
if(y1>y2) or (y1==y2 and m1>m2) or (y1==y2 and m1==m2 and d1>d2):
y1 = int(date2[0:4])
y2 = int(date1[0:4])
m1 = int(date2[4:6])
m2 = int(date1[4:6])
d1 = int(date2[6:8])
d2 = int(date1[6:8])
print count(y1, m1, d1, y2, m2, d2)
except:
break
import java.io.BufferedInputStream; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.Scanner; public class Main { public static void main(String... as) { Scanner sc = new Scanner(new BufferedInputStream(System.in)); LocalDate ld1 = LocalDate.parse(sc.next(), DateTimeFormatter.ofPattern("yyyyMMdd")); LocalDate ld2 = LocalDate.parse(sc.next(), DateTimeFormatter.ofPattern("yyyyMMdd")); System.out.println(ld1.until(ld2, ChronoUnit.DAYS) + 1); sc.close(); } }
//因为还不会格式输入,所以输入年月日的时候用了笨办法,希望大佬能帮忙改一下,谢谢!#include<iostream>
#define ISYEAP(x) ((x%4==0&&x%100!=0)||x%400==0) ?1:0
using namespace std;
int dayofmonth[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
};
struct Date {
int day;
int month;
int year;
void nextday() {
day++;
if (day>dayofmonth[month][ISYEAP(year)])
{
day = 1;
month++;
if (month>12)
{
month = 1;
year++;
}//if
}//if
}//nextday
};//data
int buf[5001][12][32];
int abs(int x) {
return x<0 ? -x : x;
}
int main() {
Date tmp;
tmp.year = 0;
tmp.month = 1;
tmp.day = 1;
int num = 0;
while (tmp.year < 5001) {
buf[tmp.year][tmp.month][tmp.day] = num;
tmp.nextday();
num++;
}//while
int d1, m1, y1, temp1;
int d2, m2, y2, temp2;
while (cin >> temp1) {
d1 = temp1 % 100; temp1 = temp1 / 100;
m1 = temp1 % 100; y1 = temp1 / 100;
cin >> temp2;
d2 = temp2 % 100; temp2 = temp2 / 100;
m2 = temp2 % 100; y2 = temp2 / 100;
cout << abs(buf[y2][m2][d2] - buf[y1][m1][d1])+1<< endl;
}
return 0;
}
献丑了。
#include<cstdio>
struct Time {
int y;
int m;
int d;
}t1,t2;
bool Is366(int year){
return (year % 4 == 0 && year % 100 != 0 || year % 100 == 0 && year % 400 == 0);
}
int month(int year, int month){
int Is31[7] = { 1,3,5,7,8,10,12 };
for (int i = 0; i < 7; i++){
if (Is31[i] == month)
return 31;
}
if (month == 2){
if (Is366(year))
return 29;
else return 28;
}
else return 30;
}
void swap(struct Time *a, struct Time *b) {
struct Time temp;
temp=*a;
*a = *b;
*b = temp;
}
int main(){
int val;
while (scanf("%4d%2d%2d %4d%2d%2d", &t1.y, &t1.m, &t1.d, &t2.y, &t2.m, &t2.d) != EOF) {
if (t1.y > t2.y) swap(&t1, &t2);
else if(t1.y==t2.y){
if (t1.m > t2.m) swap(&t1, &t2);
else if(t1.m==t2.m)
if(t1.d>t2.d) swap(&t1, &t2);
}
if (t1.y == t2.y) {
if (t1.m == t2.m)
val = t2.d - t1.d + 1;
else {
val = month(t1.y, t1.m) - t1.d + 1 + t2.d;
for (int i = t1.m + 1; i <= t2.m - 1; i++)
val += month(t1.y, i);
}
}
else {
val = month(t1.y, t1.m) - t1.d + 1;
for (int i = t1.m + 1; i <= 12; i++)
val += month(t1.y, i);
for (int i = t1.y + 1; i < t2.y; i++) {
if (Is366(i)) val += 366;
else val += 365;
}
for (int i = 1; i < t2.m; i++)
val += month(t2.y, i);
val += t2.d;
}
printf("%d\n", val);
}
return 0;
}
#include <iostream> #include <algorithm> using namespace std; int yy1,m1,d1,yy2,m2,d2; // q[1] 为闰年 int q[2][12]={{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; //闰年返回true bool isyear(int y) { if(y % 4 == 0 && y % 100 != 0 ) return true; if(y % 400 == 0) return true; return false; } int main() { int n1,n2; cin >> n1 >> n2; if(n1>n2) swap(n1,n2); yy1 = n1 / 10000; d1 = n1 % 100; m1 = n1 / 100 % 100; yy2 = n2 / 10000; d2 = n2 % 100; m2 = n2 / 100 % 100; int ans = 0; while(!(yy1 == yy2 && m1 == m2 && d1 == d2)) { int i = isyear(yy1);// i = 1 为闰年 ans ++ ; d1 ++; if(d1 > q[i][m1 - 1]) { d1 -= q[i][m1 - 1]; m1 ++; } if(m1 > 12) { yy1 ++; m1 = 1; } } if(ans == 0) cout << "0" << endl; else cout << ans + 1 << endl; }