【题目大意】:
玛雅人使用两种历法,分别是Haab历和Tzolkin历,Haab历一年有365天分为19个月,前18个月(从1到19分别用pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu,uayet来表示)每个月有20天,最后一个月很特殊只有5天。Tzolkin历一年只有260天,分为13个时期,每个时期20天,每天的表示由两部分组成。它们用20个字符串(imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau)和13个数字(从1到13)轮询的方式组合起来来表示(类似中国的天干地支计年法,只不过题中是用来计天)如第一天是:1 imix 第二天是:2 ik,依次类推下去是:3 akbal, 4 kan, 5 chicchan, 6 cimi, 7 manik, 8 lamat, 9 muluk, 10 ok, 11 chuen, 12 eb, 13 ben, 1 ix, 2 mem, 3 cib, 4 caban, 5 eznab, 6 canac, 7 ahau, and again in the next period 8 imix, 9 ik, 10 akbal . . .
【要求】:
给出Haab历的年月日,要你计算Tzolkin历的年月日
【分析】:主要难点在于通过Haab历得到从世界的开始日期到当前的总天数sumdays
【代码】:
#include<stdio.h>
int get_haab_month(char* month) /*为了得到Haab历的月份*/
{
int i,total=0;
for(i=0;month[i];i++)
total+=month[i];
switch(total)
{
case 335:return 1; /* pop */
case 221:return 2; /* no */
case 339:return 3; /* zip */
case 471:return 4; /* zotz */
case 438:return 5; /* tzec */
case 345:return 6; /* xul */
case 674:return 7; /* yoxkin */
case 328:return 8; /* mol */
case 414:return 9; /* chen */
case 338:return 10; /* yax */
case 318:return 11; /*zac*/
case 304:return 12; /*ceh*/
case 305:return 13; /*mac*/
case 636:return 14; /*kankin*/
case 433:return 15; /*muan*/
case 329:return 16; /*pax*/
case 534:return 17; /*koyab*/
case 546:return 18; /*cumhu*/
case 552:return 19; /*uayet*/
}
}
char *p[20]={"imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk","ok","chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau"};
/* 保存了Tzolkin历的月份 */
int main(void)
{
int i,n;
int haab_day,haab_month,haab_year,sumdays;
char month[10];
int tzol_num,tzol_year;
scanf("%d",&n);
printf("%d\n",n);
while(n--)
{
scanf("%d. %s %d",&haab_day,month,&haab_year);
haab_month=get_haab_month(month);
sumdays=365*haab_year+20*(haab_month-1)+haab_day; /*得到了Haab历的年月日后就计算总天数sumdays*/
tzol_year=sumdays/260; /*Tzolkin历的年份*/
sumdays-=(tzol_year*260);
tzol_num=(sumdays)%13+1; /*Tzolkin历的用于表示每天的前面的数字*/
i=sumdays%20+1;
printf("%d %s %d\n",tzol_num,p[i-1],tzol_year);
}
return 0;
}