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) && (year0!=0) ) || (year@0==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@0 == 0|| x0!=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; } 以后再仔细弄吧,现在时间不太够了~