我们经常碰到有关日期计算的问题,今天来总结一下。
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
struct Info{
int year;
int month;
int day;
int week;
};
vector<Info> v;
int judge(int year)
{
if(year%400==0||(year%4==0&&year%100!=0))
return 1;
else
return 0;
}
/*基姆拉尔森公式 已知年、月、日求该天是星期几? 适用于(1582年 10月15日以后)*/
int compute(int y,int m,int d)
{
return 1+(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
// 1 2 ..... 7
//星期一 星期二 .....星期天
}
//这个算法可以算离 某年某月某日 多少天后是(某年某月某日以及 星期几)
//或者 某年某月某日 至 某年某月某日 经过多少天
int main()
{
int i,j,k,flag;
Info stu;
int week=5;//2000年1月1日这天是星期几
for(i=2000;i<=9999;i++)
{
flag=judge(i);
for(j=1;j<=12;j++)
for(k=1;k<=31;k++)
{
//1,3,5,7,8,10,12 闰年
if(j==4||j==6||j==9||j==11)
{
if(k==31)
break;
}
if(j==2)
{
if(flag)//是闰年,2月份只有29天
{
if(k==30)
break;
}
else//不是是闰年,2月份只有28天
{
if(k==29)
break;
}
}
stu.year=i;
stu.month=j;
stu.day=k;
week++;
if(week==8)week=1;
stu.week=week;
v.push_back(stu);
}
}
int num;2000年1月1日后多少天
while( cin>>num)
{
cout<<v[num].year<<"-";
cout<<v[num].month<<"-"<<v[num].day<<"-"<<v[num].week<<endl;
if(num==0)
break;
}
return 0;
}