OK,刷题继续,这次是日期类问题。
首先明确:闰年是年份能被4整除且不能被100整除 或者 能被400整除的年份。
第一个题:
输入年、月、日,计算该天是本年的第几天。
---来源牛客网
输入描述:
包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)
输入:
1990 9 20 2000 5 1
输出: 263 122
解题思路:判断是否是闰年,之后根据月份来计算天数。
代码:
#include<iostream>
using namespace std;
int main()
{
int year,month,day;
while(cin>>year>>month>>day)
{
int Month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int number = 0;
if(( (year%4==0) && (year%100!=0) ) || (year%400==0))//闰年
{
Month[2] = Month[2] + 1;
}
for(int i = 1; i < month; i++)
{
number += Month[i];
}
number += day;
cout<<number<<endl;
}
}
第二个题:
输入日期,判断当前是星期几
-----来源王道考研机试指南
输入:
9 October 2001
14 October 2001
输出:
Tuesday
Sunday
解题思路:计算输入日期与当前日期的天数差,然后根据当前的星期数,计算得到输入日期的星期数。天数差可以提前计算得到,以一个自己指定的日期为基数。分别计算两个日期与基数的差,然后就可以得到两个 日期的天数差。
#include<stdio.h>
#include<string.h>
#define YEAP(x) x%400 == 0|| x%100!=0 && x%4==0?1: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
};
char NameOfMonth[13][20]={
" ",
"January","February","March","April","May","June",
"July","August","September","October","November","December"
};
char NameOfWeekday[7][20]={
"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
};
struct Date{
int Day;
int Month;
int Year;
void Next_Day()
{
Day++;
if(Day > DayOfMonth[Month][YEAP(Year)])//判断天数是否大于当前月的天数,如果大于则月数加一,day置1
{
Day = 1;
Month++;
if(Month>12)
{
Month = 1;
Year++;
}
}
}
};
int Buf[3001][13][32];
int main()
{
int cnt = 0;
Date tmp;
tmp.Year = 0;
tmp.Month = 1;
tmp.Day = 1;
while(tmp.Year<3001)//计算3000年的差值
{
Buf[tmp.Year][tmp.Month][tmp.Day] = cnt;
tmp.Next_Day();
cnt++;
}
int d1,m1,y1;
char m[20];
while(scanf("%d%s%d",&d1,m,&y1)!=EOF)
{
for(m1=1;m1<12;m1++)
{
if(strcmp(NameOfMonth[m1],m)==0)
break;
}
int days = Buf[y1][m1][d1]-Buf[2018][4][10];
days += 2;
puts(NameOfWeekday[(days%7+7)%7]);
}
return 0;
}
以后再仔细弄吧,现在时间不太够了~