玛雅历
lHaab日历:拥有19个月,在开始的18个月,一个月有20天,月份的名字分别是pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu. 日期用0到19表示,最后一个月uayet,只有5天。
lTzolkin(holly年)历,一年被分成13个不同时期,每个时期有20天,每一天用一个数字(1~13)和一个单词(imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau)共20个。数字和单词各自循环使用。
l编程将Haab日历转化成Tzolkin历。
问题描述
输入数据
Haab历中的数据由如下的方式表示:
日期. 月份年数
第一行表示要转化的Haab 历的数据量。下面的每一行表示一个日期,年数小于5000。
输出要求
Tzolkin 历中的数据由如下的方式表示:
天数字天名称年数
第一行表示需要转化的Haab 历的数据量。下面的每一行表示一个日期。
Haab历每年365天,19个月用0~18 表示。前18个月20天,第19个月有5天,19个月的名字用不同字串表示,日期从0开始。通过月份*20+日期+1计算某个月的某一天是当年的第几天。
Tzolkin历一年有260天,每个日期由数字和字符串组成。数字从1~13,有20个不同的字符串,两个部分彼此独立。对于一年中某一天,可分别求出数字和字符串部分,然后组合。
解题思路:首先计算Haab历表示的日期是世界开始后的第几天(假设是k),然后用k除以260得到Tzolkin历的年份,再用k对260取模得到m,用m分别对13和20取模得到d和s,d和Tzolkin历中第s个字符串的组合就是要求的日期。
l 注意:如果把世界的第1天用0表示,第260天用259表示,则用k除以260得到Tzolkin历的年份,m对13取模后得到0到12的值,这个值要加1才能用于表示Tzolkin历的日期,同时m对20取模后得到0~19的数值,分别表示取20个字符串中的一个。
#include <stdio.h>
#include <string.h>
#define NAMELEN 10
char month1[19][NAMELEN] ={"pop","no","zip","zotz","tzec","xul","yoxkin","mol", "chen", "yax","zac","ceh","mac","kankin","muan","pax","koyab","cumhu","uayet"};// Haab历月份
char month2[20][NAMELEN] ={"imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk", "ok", "chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau"};// Tzolkin历
int main( )
{int nCases, i, m;scanf("%d", &nCases);printf("%d\n", nCases);for (i = 0; i < nCases; i++){int day, year, dates;char month[NAMELEN];scanf("%d. %s %d", &day, month, &year);for(m = 0; m < 19; m++)if (!strcmp(month1[m], month)) break;dates = year*365 + m*20 + day;printf("%d %s %d\n",1+dates%13, month2[dates%20],dates/260);}return 0;
}