日期类问题

1051日期计算

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

定义一个结构体变量(包括年、月、日),编程序,要求输入年月日,计算并输出该日
在本年中第几天。

输入描述:

1输入三个整数(并且三个整数是合理的,既比如当输入月份的时候应该在1 至12 之间,
2不应该超过这个范围)否则输出Input error!
3多组测试数据输入

输出描述:

1输出一个整数.既输入的日期是本年的第几天。

输入样例:

11985 1 20
22006 3 12

输出样例:

120
271
 1#include<iostream>
 2#include<array>
 3using namespace std;
 4struct node{
 5    int year,month,day;
 6}p;
 7array<int,13> m={0,31,28,31,30,31,30,31,31,30,31,30,31};
 8int main(){
 9    while(cin>>p.year>>p.month>>p.day){
10        int res=0;
11        if(p.year%400==0||(p.year%4==0&&p.year%100!=0)){
12            m[2]=29;
13        }else{m[2]=28;}
14        if(p.month<1||p.month>12||p.day<1||p.day>m[p.month]){
15            cout<<"Input error!"<<endl;
16            continue;
17        }
18        for(int i=1;i<p.month;i++){
19            res+=m[i];
20        }
21        res+=p.day;
22        cout<<res<<endl;
23    }
24    return 0;
25}

1011日期

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

今天是2012年4月12日星期四,编写程序,输入今天开始到12月31日之间的任意日期,输出那一天是星期几。例如输入“5(回车)20(回车)”(5月20日),输出应为“Sunday”。

输入描述:

1输入第一行为月份。
2输入第二行为这个月的第几天。

输出描述:

1输入这一天是星期几。

输入样例:

15
220

输出样例:

1Sunday
 1#include<iostream>
 2#include<array>
 3using namespace std;
 4array<int,13> m={0,31,29,31,18,31,30,31,31,30,31,30,31};
 5int main(){
 6    int month,day;
 7    while(cin>>month>>day){
 8        int res=0;
 9        for(int i=4;i<month;i++){
10            res+=m[i];
11        }
12        if(month==4){
13            res+=day-12;
14        }else{
15            res+=day;
16        }
17        int a=res%7;
18        switch(a){
19        case 0:
20            cout<<"Thursday"<<endl;
21            break;
22        case 1:
23            cout<<"Friday"<<endl;
24            break;
25        case 2:
26            cout<<"Saturday"<<endl;
27            break;
28        case 3:
29            cout<<"Sunday"<<endl;
30            break;
31        case 4:
32            cout<<"Monday"<<endl;
33            break;
34        case 5:
35            cout<<"Tuesday"<<endl;
36            break;
37        case 6:
38            cout<<"Wednesday"<<endl;
39            break;
40        }
41    }
42    return 0;
43}

1290日期差值

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

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

输入描述:

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

输出描述:

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

输入样例:

120110412
220110422

输出样例:

111
 1#include<iostream>
 2#include<string>
 3#include<array>
 4#include<algorithm>
 5using namespace std;
 6
 7int days_of_year(int year){
 8    if(year%400==0||(year%4==0&&year%100!=0)){
 9        return 366;
10    }
11    else return 365;
12}
13int main(){
14    string x,y;
15    array<int,13> m={0,31,28,31,30,31,30,31,31,30,31,30,31};
16    while(cin>>x>>y){
17        int y1,y2,m1,m2,d1,d2,res=1;
18        y1=stoi(x.substr(0,4));
19        y2=stoi(y.substr(0,4));
20        m1=stoi(x.substr(4,2));
21        m2=stoi(y.substr(4,2));
22        d1=stoi(x.substr(6,2));
23        d2=stoi(y.substr(6,2));
24        if(y1!=y2){
25            for(int i=y1;i<y2;i++){
26                res+=days_of_year(i);
27            }
28        }
29
30        if(m1!=m2){
31            if(y2%400==0||(y2%4==0&&y2%100!=0)){
32                m[2]=29;
33            }else{m[2]=28;}
34            int tmpt1=0,tmpt2=0,det;
35            for(int i=1;i<m1;i++){
36                tmpt1+=m[i];
37            }
38            for(int i=1;i<m2;i++){
39                tmpt2+=m[i];
40            }
41            det=tmpt2-tmpt1;
42            res+=det;
43        }
44
45        if(d1!=d2){
46            res+=d2-d1;
47        }
48        cout<<res<<endl;
49    }
50    return 0;
51}

1410打印日期

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

给出年分m和一年中的第n天,算出第n天是几月几号。

输入描述:

1输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。

输出描述:

1可能有多组测试数据,对于每组数据,
2按 yyyy-mm-dd的格式将输入中对应的日期打印出来。

输入样例:

12000 3
22000 31
32000 40
42000 60
52000 61
62001 60

输出样例:

12000-01-03
22000-01-31
32000-02-09
42000-02-29
52000-03-01
62001-03-01
 1#include<iostream>
 2#include<array>
 3#include<iomanip>
 4using namespace std;
 5int main(){
 6    int y,n;
 7    array<int,13> m={0,31,28,31,30,31,30,31,31,30,31,30,31};
 8    while(cin>>y>>n){
 9        int tmp=0,month=1;
10
11        if(y%400==0||(y%4==0&&y%100!=0)){
12            m[2]=29;
13        }else{m[2]=28;}
14
15        while(1){
16            tmp+=m[month++];
17            if(tmp>=n){
18                month--;
19                tmp-=m[month];
20                break;
21            }
22        }
23        int day=n-tmp;
24        cout<<setfill('0');
25        cout<<y<<"-";
26        cout<<setw(2)<<month<<"-";
27        cout<<setw(2)<<day<<endl;
28    }
29    return 0;
30}

1437日期类

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

编写一个日期类,要求按xxxx-xx-xx 的格式输出日期,实现加一天的操作。

输入描述:

1输入第一行表示测试用例的个数m,接下来m行每行有3个用空格隔开的整数,分别表示年月日。测试数据不会有闰年。

输出描述:

1输出m行。按xxxx-xx-xx的格式输出,表示输入日期的后一天的日期。

输入样例:

12
21999 10 20
32001 1 31

输出样例:

11999-10-21
22001-02-01
 1#include<iostream>
 2#include<array>
 3#include<iomanip>
 4using namespace std;
 5int main(){
 6    int n;
 7    cin>>n;
 8    array<int,13> m={0,31,28,31,30,31,30,31,31,30,31,30,31};
 9    while(n--){
10        int year,month,day;
11        cin>>year>>month>>day;
12        if(++day>m[month]){
13            month+=1;
14            if(month>12){
15                year++;
16                month=1;
17            }
18            day=1;
19        }
20        cout<<year<<"-";
21        cout<<setfill('0');
22        cout<<setw(2)<<month<<"-";
23        cout<<setw(2)<<day<<endl;
24    }
25    return 0;
26}

1446日期累加

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

设计一个程序能计算一个日期加上若干天后是什么日期。

输入描述:

1输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。

输出描述:

1输出m行,每行按yyyy-mm-dd的个数输出。

输入样例:

11
22008 2 3 100

输出样例:

12008-05-13
 1#include<iostream>
 2#include<array>
 3#include<iomanip>
 4using namespace std;
 5int main(){
 6    int m;
 7    cin>>m;
 8    array<int,13> mon={0,31,28,31,30,31,30,31,31,30,31,30,31};
 9    while(m--){
10        int year,month,day,add;
11        cin>>year>>month>>day>>add;
12        if(year%400==0||(year%4==0&&year%100!=0)){
13            mon[2]=29;
14        }else{
15            mon[2]=28;
16        }
17        add+=day;
18        while(1){
19            if(year%400==0||(year%4==0&&year%100!=0)){
20                mon[2]=29;
21            }else{
22                mon[2]=28;
23            }
24            if(add<=0){
25                month--;
26                if(month<1){
27                    month=12;
28                    year--;
29                }
30                day=add+mon[month];
31                break;
32            }
33            add-=mon[month++];
34            if(month>12){
35                year++;
36                month=1;
37            }
38        }
39        cout<<year<<"-";
40        cout<<setfill('0');
41        cout<<setw(2)<<month<<"-";
42        cout<<setw(2)<<day<<endl;
43    }
44    return 0;
45}

1053偷菜时间表

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb

随着“开心农场”等娱乐游戏风靡互联网,“偷菜”遂瞬间蹿红网络,席卷网民生活。
于是,“你‘偷’了吗”便成为大家见面的招呼语。很快,数百万都市白领成为“偷菜”队
伍中的主力军,每天在“偷”与防“偷”中乐此不疲,甚至定闹钟半夜起床“偷”菜。根据
“农作物”生长规律而变化制定偷菜时间表。

输入描述:

1假设当前时间为13:15,第一行输入作物种类数n,
2从第二行开始输入n 种作物成熟需要的时间,格式为
3Hour:Minute。

输出描述:

1依次输出n 种作物成熟时间,每行输出一个

输入样例:

13
20:30
31:10
412:50

输出样例:

113:45
214:25
32:5
 1#include<iostream>
 2#include<string>
 3using namespace std;
 4int main(){
 5    int n;
 6    cin>>n;
 7
 8    for(int i=0;i<n;i++){
 9        string s;
10        cin>>s;
11        int h=0,m=0,sth=13,stm=15;
12        for(int i=0,flag=0;i<s.size();i++){
13            if(s[i]==':'){
14                flag=1;
15                continue;
16            }
17            if(flag==0){
18                h=h*10+s[i]-'0';
19            }
20            else if(flag==1){
21                m=m*10+s[i]-'0';
22            }
23        }
24    cout<<((stm+m)/60+h+sth)%24<<":"<<(m+stm)%60<<endl;
25    }
26    return 0;
27}