关于日期,主要还是计算天数,形式会多变,但还是万变不离其中,我会记录两道关于日期类的题目,主要函数依然不变
总结:
int cal(int y,int m,int d) { int days=d; bool isprime=0; int a[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}; if(y%4==0&&y%100!=0||y%400==0) isprime=1; for(int i=0;i<m;i++) { days+=a[isprime][i]; } return days; }
1.高斯日记
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113 请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
分析:这道题的话是给定日期与天数,去计算
下面是解决这道题的代码
#include<iostream>
using namespace std;
int m[2][12]={//闰平年对应的月份
31,29,31,30,31,30,31,31,30,31,30,31,
31,28,31,30,31,30,31,31,30,31,30,31
};
bool judge(int n)//判断是否是闰年
{
if(n%400==0||(n%4==0&&n%100!=0)) return 1;
return 0;
}
int main()
{
int n;
while(cin>>n)
{
int year=1777,month=4,day=30;
while(--n)
{
day++;//模拟天数
if(day>m[!judge(year)][month-1])//如果天数大于当前月份对应的天数月份加一
{
month++;
if(month>12)//如果月份大于12,年份加一,月份清成一
{
year++;
month=1;
}
day=1;//天数清成一
}
}
cout<<year<<"--"<<month<<"--"<<day<<endl;
}
return 0;
}
2.
1949年的国庆节(10月1日)是星期六。
今年(2012)的国庆节是星期一。那么,从建国到现在,有几次国庆节正好是星期日呢?
#include <iostream> using namespace std; int cal(int y,int m,int d) { int days=d; bool isprime=0; int a[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}; if(y%4==0&&y%100!=0||y%400==0) isprime=1; for(int i=0;i<m;i++) { days+=a[isprime][i]; } return days; } int main() { int total=cal(1949,12,31)-cal(1949,10,2);//注意题目上面写的是1949年10.1号是星期六,说明10月2日是星期天 for(int i=1950;i<2012;i++) { total+=cal(i,10,1)-cal(i,1,1)+1;//这个+1是1.1号也算一天 if((total)%7==0) { cout<<i<<endl; } } return 0; }