做题列表
PAT上没有相应题目,在这里做练习。
问题 A: 日期差值
- 年:年份不同,y1累加,直到等于第二个日期的y2-1,闰年366,平年365天
- 月:天数等于这个月的天数+1,则月加1,天数变为1;如果月数为13,则年数+1,月变为1
- 天数逐个加一直到等于第二个日期,即为结果。
- 用二维数组month[13][2]存储每个月对应的天数,第二维数组,0表示平年时的天数,1表示闰年的天数。
- 写一个判断闰年的函数,是返回1,不是则为0,与上边的数组对应起来。
#include<bits/stdc++.h>
using namespace std;
bool isLead(int year)
{
return (year%4==0 && year%100==0) || (year%400==0);
}
int month[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 main()
{
int time1,y1,m1,d1;
int time2,y2,m2,d2;
while(cin>>time1>>time2)
{
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 count=1;
while(y1<y2 || m1<m2 || d1<d2)
{
d1++;
if(d1==month[m1][isLead(y1)]+1)
{
m1++;
d1=1;
}
if(m1==13)
{
y1++;
m1=1;
}
count++;
}
cout<<count<<endl;
}
return 0;
}
运行超时,下边是运行正确代码:
#include <bits/stdc++.h>
using namespace std;
int month[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}};
bool isLeap(int year)
{
return (year%4==0 && year%100!=0) || (year%400==0);
}
int main()
{
int time1,y1,m1,d1;
int time2,y2,m2,d2;
while(cin>>time1>>time2)
{
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 count=0;
if(y1!=y2) //年份不同
{
for(int i=y1+1;i<y2;i++) //年数逐渐加一,直到小于y2,例如y1=20131101,y2=20150921,不能等于2015,因为那样月数就超了。加到2014年则y1=20141101,再计算月数。
{
if(isLeap(i)) count+=366;
else count+=365;
}
count+=(month[m1][isLeap(y1)]-d1+1);//11月减去d1天数+1,即为剩下的天数
count+= d2;//9月到0921的天数
for(int i=m1+1;i<=12;i++)//计算m1到2013年年底12月的天数
{
count+=month[i][isLeap(y1)];
}
for(int i=1;i<m2;i++)//计算从1月到9月(小于9月)的天数
{
count+=month[i][isLeap(y2)];
}
}
else if(m1!=m2)//同一年,不同月
{
count+=(month[m1][isLeap(y1)]-d1+1);
count+= d2;
for(int i=m1+1;i<m2;i++)
{
count+=month[i][isLeap(y1)];
}
}
else count+=d2-d1+1;//同一年,同一月,不同天
cout<<count<<endl;
}
return 0;
}
问题 B: Day of Week
- 从1年1月1日开始计算,从输入的日期到这1.1.1,总天数对7进行求余,余数为0的为周天,其他的1~6对应周一到周六。
- 为什么使用二维数组:char a[15][20]是因为char [10]只是定义了一个字符串,字符串里的字符数量为10,char a[15][20]表示有20个字符串大小为15 的字符串。
#include <bits/stdc++.h>
using namespace std;
int month[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}};
char a[15][20]={"0","January","February","March","April","May","June","July","August","September","October","November","December"};
char b[8][20]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
bool isLeap(int year)
{
return (year%4==0 && year%100!=0) || (year%400==0);
}
int main()
{
char m[20];
int y,d,k;
while(cin>>d>>m>>y)
{
int sum=0;
for(int i=1;i<y;i++)//年数
{
if(isLeap(i)) sum+=366;
else sum+=365;
}
for(k=1;k<=12;k++)//输入的是几月,由英文变为数字
{
if(strcmp(m,a[k])==0) break;
}
for(int i=1;i<k;i++)//月数
{
sum+=month[i][isLeap(y)];
}
sum+=d; //天数
if(sum%7==0) cout<<"Sunday"<<endl;
else cout<<b[sum%7-1]<<endl;
}
return 0;
}
问题 C: 打印日期
题目描述
对输入的日期逐个减一,定义一个d表示天数,逐个加一,如果天数等于某月天数加一,则月份加一,天变为该月的第一天;若月数m=13,则年数加一,月份变为一月。直到n为0,即可得出日期。
#include <bits/stdc++.h>
using namespace std;
int month[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}};
bool isLeap(int year)
{
return (year%4==0 && year%100!=0) || (year%400==0);
}
int main()
{
int y,n,m=1,d=0;
while(cin>>y>>n)
{
while(n--)
{
d++;
if(d==month[m][isLeap(y)]+1)
{
m++;
d=1;
}
if(m==13)
{
y++;
m=1;
}
}
printf("%04d-%02d-%02d\n",y,m,d);
m=1,d=0;
}
return 0;
}
问题 D: 日期类
问题描述
这题很简单,没有闰年的情况,只需处理好临界值:
- 天数加一正好和某个月的天数加一相等,则月份加一,天数变为一;
- 月份为12时,且天数加一后变为下一个月(月份=13),则年份加一,月份变为1,天数也变为1。
#include <bits/stdc++.h>
using namespace std;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int n;
cin>>n;
int y,m,d;
while(n--)
{
cin>>y>>m>>d;
d++;
if(d==month[m]+1)
{
m++;
d=1;
}
if(m==13)
{
y++;
m=1;
}
printf("%04d-%02d-%02d\n",y,m,d);
}
return 0;
}
问题 E: 日期累加
#include<bits/stdc++.h>
using namespace std;
bool isLeap(int year)
{
return (year%4==0 && year%100!=0) || (year%400==0);
}
int month[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 main()
{
int n;
cin>>n;
int y,m,dd,d;
while(n--)
{
cin>>y>>m>>dd>>d;
while(d--)
{
dd++;
if(dd==month[m][isLeap(y)]+1)
{
m++;
dd=1;
}
if(m==13)
{
y++;
m=1;
}
}
printf("%04d-%02d-%02d\n",y,m,dd);
}
return 0;
}