poj1008(模拟)

来源:互联网 发布:昌吉电信怎么用4g网络 编辑:程序博客网 时间:2024/06/06 14:24

传送门:poj1008

题意和解法都挺简单的,从这个题中能学到的最重要的就是对边界和特殊情况的处理,从总天数转化到要输出的年份、月份、天的时候处理情况都不相同,天数是减一取余再加一,月份由于涉及到数组的下标,边界情况很不好处理,这里就要把最后一个月份放到数组最开头,这样正常取余就好了,年份要注意的一点是,全年若有260天,则第260天也是上一年的而不是下一年的。

#include <iostream>#include <cstdio>#include <cstring>#include <math.h>using namespace std;char s[50];char month[19][10]={"pop","no","zip","zotz","tzec","xul","yoxkin","mol","chen","yax","zac","ceh","mac","kankin","muan","pax","koyab","cumhu","uayet"};char Tzolkin[20][10]={"ahau","imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk","ok","chuen","eb",  "ben","ix","mem","cib","caban","eznab","canac"};int main(){int t;scanf("%d",&t);printf("%d\n",t);getchar();while(t--){memset(s,0,sizeof(s));gets(s);int n=0;if('0'<=s[1]&&s[1]<='9')n=(s[0]-'0')*10+s[1]-'0';elsen=s[0]-'0';int len=strlen(s);char s1[10];memset(s1,0,sizeof(s1));int c=0;for(int i=0;i<len;i++){if('a'<=s[i]&&s[i]<='z')s1[c++]=s[i];}int tt;for(int i=0;i<20;i++){if(strcmp(s1,month[i])==0){tt=i;break;}}double year=0;for(int i=len-1;i>len-5;i--){if('0'<=s[i]&&s[i]<='9'){year+=(pow(10,(len-i-1))*(s[i]-'0'));}}int day=year*365+tt*20+n+1;if(day%260)printf("%d %s %d\n",(day-1)%13+1,Tzolkin[day%20],day/260);elseprintf("%d %s %d\n",(day-1)%13+1,Tzolkin[day%20],(day-1)/260);}return 0;}


0 0