题目:玛雅使用两种日历,第一种称为Haab,一年为365天,一年分为19个月,前18个月每个月都是20天,第19个月为5天,每一个月都有一个名字,分别为pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu和uayet,每个月份中的天数用0到19表示。最后一个月份中的天数用0到4表示。玛雅使用的第二个日历称为Tzolkin,在这个日历中,一年为260天,一年分为13段,每段20天(260=13*20),每一天用一个数字和一个名字表示,总共20个名字: imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau,数字为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, 然后进入下一段 8 imix, 9 ik, 10 akbal。。。
现在的任务是要将一个Haab日历格式的日期转换为Tzolkin日历格式的日期。年份从0开始,从日期开始点开始,第一天在两种日历中分别为:
Haab:0. pop 0
Tzolkin: 1 imix 0
输入:输入的日期为Haab日历格式,第一行输入日期的个数,第二行开始输入日期。输入日期的格式为:
天数.月份 年份 例如: 10. zac 0,天数和年份都从0开始
输出:输出的日期为Tzolkin日历格式。第一行输出日期的个数,第二行开始输出Tzolkin格式的日期,输出日期的格式为:
数字 天名字 年份 例如:3 chuen 0, 数字为1到13,年份从0开始
解题思路:
1 先将输入的日期转换为距离日期开始点的天数:
date = year*365+month*20+天数
2 根据date求出Tzolkin日历格式的年份,月份,天数
year = date/260;
date = date%260;
数字=date%13+1; (加1是因为数字从1开始)
天名字下标=date%20;(20个天名字的下标从0到19,根据计算出的天名字下标就可以得到相应的天名字)
3 将转换后的结果输出到链表中保存,以便所有日期转换完成后一次性输出。
代码:
#include<stdio.h> #include<string.h> char *Haab[] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", "yax", "zac", "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu", "uayet"}; char *Tzolkin[] = {"imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik", "lamat", "muluk", "ok", "chuen", "eb", "ben", "ix", "mem", "cib", "caban", "eznab", "canac", "ahau"}; struct result { char s[24]; struct result *next; }; //在一个字符串数组中搜索指定字符串的下标 int searchStr(char *list[], int n, char *str) { int i; for(i=0; i<n; i++) { if(strcmp(list[i],str)==0) { return i; } } return -1; } int main() { int day,month,year,date,n,i; char s[24]; struct result *head=NULL,*p; struct result *tail=NULL; scanf("%d",&n); for(i=0; i<n; i++) { scanf("%d. %s %d",&day, s, &year); month = searchStr(Haab, 19, s); date = year*365+month*20+day; //进行日历转换 year = date/260; date = date%260; day = date%13 + 1; month = date%20; //保存转换结果 if(head==NULL) { head=tail = (struct result *)malloc(sizeof(struct result)); tail->next = NULL; } else { tail->next = (struct result *)malloc(sizeof(struct result)); tail = tail->next; tail->next = NULL; } sprintf(tail->s,"%d %s %d", day, Tzolkin[month], year); } //输出 printf("%d\n",n); p = head; while(p != NULL) { printf("%s\n",p->s); p = p->next; } return 0; }