1.计算日期到天数转换
描述
每一年中都有 1212 个月份。其中,1,3,5,7,8,10,121,3,5,7,8,10,12 月每个月有 3131 天;4,6,9,114,6,9,11 月每个月有 3030 天;而对于 22 月,++闰年++ 时有 2929 天,平年时有 2828 天。
现在,对应输入的日期,计算这是这一年的第几天。
一个年份是++闰年++ 当且仅当它满足下列两种情况其中的一种:
∙ ∙这个年份是 44 的整数倍,但不是 100100 的整数倍;
∙ ∙这个年份是 400400 的整数倍。输入描述:
在一行上输入三个整数 a,b,c(1900≦a≦2200)a,b,c(1900≦a≦2200),分别代表年、月、日。保证输入的日期是合法的。
输出描述:
输出一个整数,代表输入的日期是这一年的第几天
题解:
#include <atomic> #include <climits> #include <iostream> using namespace std; int main() { int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int a, b,c,sum; cin >> a >> b >> c; // 注意 while 处理多个 case if(((a%4==0&&a%100!=0)||a%400==0)) { arr[2]=29; } for(int i=1;i<b;i++) { sum+=arr[i]; } cout << sum+c << endl; }
2.日期差值
描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述:
每组数据输出一行,即日期差值
题解:
#include <climits> #include <ctime> #include <iostream> using namespace std; int GetMonthDay(int y,int m) { int month[] = { 0, 31, 28, 31, 30, 31, 30, 31,31, 30, 31, 30, 31 }; if (m == 2 && ((y % 4 == 0 && y % 100 != 0)|| y % 400 == 0)) return 29; return month[m]; } class Date { public: Date(int year=1,int month=1,int day=1) :_year(year) ,_month(month) ,_day(day) {} friend Date GetDate(int n); bool operator!=(Date& d) { if(_year!=d._year) return true; if(_month!=d._month) return true; if(_day!=d._day) return true; return false; } Date& operator++() { ++_day; if(_day>GetMonthDay(_year,_month)) { _day-=GetMonthDay(_year,_month); ++_month; if(_month==13) { ++_year; _month=1; } } return *this; } bool operator<(Date& d) { if(_year<d._year) return true; if(_month<d._month) return true ; if(_day<d._day) return true; return false; } int operator-(Date& d) { Date maxi=*this; Date mini=d; if(*this<d) { maxi=d; mini=*this; } int count=0; while(mini!=maxi) { ++count; ++mini; } return count; } private: int _year; int _month; int _day; }; Date GetDate(int n) { Date d; d._year=n/10000; d._month=n/100-d._year*100; d._day=n%100; return d; } int main() { int a,b; while(cin>>a>>b) { Date d1=GetDate(a); Date d2=GetDate(b); if(d1<d2) cout<<d2-d1+1<<endl; else cout<<d1-d2+1<<endl; } }
3. 打印日期
描述
给出年分m和一年中的第n天,算出第n天是几月几号。
输入描述:
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出描述:
可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。
题解
#include <iostream> using namespace std; int main() { int year=0,day=0,month=0; while(cin>>year>>day) { int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if((year%4==0&&year%100!=0)||year%400==0) { arr[2]=29; } for(int i=1;i<13;i++) { if(day>arr[i]) { day-=arr[i]; } else{ month=i; break; } } if(month<10) { if(day<10) cout<<year<<"-"<<0<<month<<"-"<<0<<day<<endl; else cout<<year<<"-"<<0<<month<<"-"<<day<<endl; } if(month>=10) { if(day<10) cout<<year<<"-"<<month<<"-"<<0<<day<<endl; else cout<<year<<"-"<<month<<"-"<<day<<endl; } } }
解法二:构造函数
#include<iostream> using namespace std; class Date{ public: Date(int year,int day) :_day(0),_month(1),_year(year) { int tmp=day; isleapyear=(!(_year % 4) && _year % 100) || !(_year % 400); for(int mday=getmonthday(_month);tmp>mday;mday=getmonthday(_month)){ _month++; if(_month==13){ _year++; _month=1; } tmp-=mday; } _day=tmp; printf("%04d-%02d-%02d\n", _year, _month, _day); } private: int getmonthday(int month){ static int monthdayarr[]={31,28,31,30,31,30,31,31,30,31,30,31}; return monthdayarr[month-1]+(month==2&&isleapyear?1:0); } bool isleapyear; int _year; int _month; int _day; }; int main(){ int year,day; while(~scanf("%d %d",&year,&day)){ Date tmp(year,day); } }
4.日期累加
描述
设计一个程序能计算一个日期加上若干天后是什么日期。
输入描述:
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出描述:
输出m行,每行按yyyy-mm-dd的个数输出。
题解:
#include <iostream> #include <type_traits> using namespace std; bool isleapYear(int year) { if((year%4==0&&year%100!=0)||year%400==0) { return true; } return false; } int main() { int x,year,day,month,num; cin>>x; while(cin>>year>>month>>day>>num) { int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if(isleapYear(year)) { arr[2]=29; } day+=num; for(int i=month;i<100;i++) { if(i==13) { year++; if(isleapYear(year)) { arr[2]=29; } else { arr[2]=28; } i=0; } if(day>arr[i]) { day-=arr[i]; } else { month=i; break; } } if(month<10) { if(day<10) cout<<year<<"-"<<0<<month<<"-"<<0<<day<<endl; else cout<<year<<"-"<<0<<month<<"-"<<day<<endl; } if(month>=10) { if(day<10) cout<<year<<"-"<<month<<"-"<<0<<day<<endl; else cout<<year<<"-"<<month<<"-"<<day<<endl; } } }

