题目地址 :http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1420
思路:
一开始看这个题觉得题意简单但不同的月份有不同的天数,有点不知怎么方便的解决。 然后想到打表的方法,把每一天的信息作为一个结构体,一一存在向量里面,向量的角标是自增的,刚好就是里2000-01-01的天数。
注意 :
1 闰年的判断
2输出格式 1-1要写成 01-01
3 超内存问题 要把三个属性值设置成 short int ,直接int会超内存
4 星期问题,2000-01-01是周六 所以第n天就是 周(n+6)%7
代码:
#include<iostream> #include<string> #include<vector> using namespace std; struct date { short year; short month; short day; }; bool isleap(int n) { if(n%4==0&&n%100!=0) return 1; if(n%400==0) return 1; return 0; } int shortmonth(int n) { if(n==2||n==4||n==6||n==9||n==11) return 1; else return 0; } int main() { int n; string * day=new string[7]; day[0]="Monday"; day[1]="Tuesday"; day[2]="Wednesday"; day[3]="Thursday"; day[4]="Friday"; day[5]="Saturday"; day[6]="Sunday"; vector<date> v; for(int i=2000;i<10000;i++) for(int j=1;j<=12;j++) for(int k=1;k<=31;k++) { if(j==2&&isleap(i)&&k>29) continue; if(j==2&&(!isleap(i))&&k>28) continue; if(shortmonth(j)&&k>30) continue; date today; today.year=i; today.month=j; today.day=k; v.push_back(today); } while(cin>>n) { if(n==-1) break; cout<<v[n].year<<"-"; if(v[n].month<10) cout<<"0"; cout<<v[n].month<<"-"; if(v[n].day<10) cout<<"0"; cout<<v[n].day<<" "; cout<<day[(n+5)%7]<<endl; } }