玛雅日历转换

本文介绍了一种将玛雅Haab历转换为Tzolkin历的算法实现。该算法通过计算日期在玛雅历中的具体位置来确定其在Tzolkin历中的对应日期。文章提供了完整的C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

玛雅历

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;
}


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值