1.预处理
2.闰年2月有29天 判断规则
题目:输入年月日,计算该天是本年的第几天?
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int daytab[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 IsLeapYear(int year){
return (year%100!=0&&year%4==0)||(year%400==0);
}//!!!
int main(){
int year,month,day;
while(scanf("%d%d%d",&year,&month,&day)!=EOF){
int number=0;
int row=IsLeapYear(year);
for(int j=0;j<month;j++){
number+=daytab[row][j];
}
number+=day;
cout<<number<<endl;
}
}
题目:给出年份m和该年的第n天,算出是几月几号
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int daytab[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 IsLeapYear(int year){
return (year%100!=0&&year%4==0)||(year%400==0);
}
int main(){
int year,month,day,number,sum=0;
while(scanf("%d%d",&year,&number)!=EOF){
sum=0;
int row=IsLeapYear(year);
int j=0;
for(j=0;j<13;j++){//!!!
if(sum+daytab[row][j]>=number) break;
sum+=daytab[row][j];
}
month=j;
day=number-sum;
printf("%04d-%02d-%02d\n",year,month,day);
}
}
题目:根据今日日期 确定给定日期是星期几
应用到map
求两日期天数之差
#include<iostream>
#include<cstdio>
#include<string>
#include<map>
using namespace std;
map<string,int>table={ {"January",1}, {"February",2}, {"March",3}, {"April",4}, {"May",5}, {"June",6}, {"July",7}, {"August",8}, {"September",9}, {"October",10}, {"November",11}, {"December",12} };
string ss[7] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday","Sunday" };
int daytab[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 leap(int year){
return (year%100!=0&&year%4==0)||(year%400==0);
}
int days(int year,int month,int day){
int days=0;
int row=leap(year);
for(int i=0;i<month;i++){
days+=daytab[row][i];
}
days+=day;
return days;
}
int main(){
int day,year,month,gap,days1,days2; string m;
while(scanf("%d",&day)!=EOF){
gap=0;
cin>>m; cin>>year;
month=table[m];//map
//确定日期之差
if(year==2021){//同年
days1=days(2021,7,14);
days2=days(year,month,day);
gap=days1-days2>0?days1-days2:days2-days1;
}
else{//不同年
int maxyear=year>2021?year:2021;
int minyear=year<2021?year:2021;
if(year>2021){
if(leap(2021)) days1=366-days(2021,7,14);
else days1=365-days(2021,7,14);
days2=days(year,month,day);
}
if(year<2021){
if(leap(year)) days1=366-days(year,month,day);
else days1=365-days(year,month,day);
days2=days(2021,7,14);
}
for(int i=minyear+1;i<maxyear;i++){
if(leap(i)) gap+=366;
else gap+=365;
}
gap=gap+days1+days2;//“小年”+中间年+“大年”
}
//由日期之差确定是星期几
int d;
if(year>2021||year==2021&&month>7||year==2021&&month==7||day>14)//所给日期在今日之后
d=gap%7+3;
else d=3-gap%7;//所给日期在今日之后
if(d>7) d=d%7;
if(d<=0) d=d+7;
cout<<ss[d-1]<<endl;
}
}