北大oj-1008 C语言

时间:2022-05-23 00:23:22

     C语言一直以来都是自己最喜欢的语言,所以,还是更倾向于用C语言来做算法编写工作。北大oj1008题是说,古代玛雅文明使用两种时间计算方式,一种是每年按照365天计算,(与我们今天的纪年方式类似),他们将这365天分为19个月,这事19个月分别是:pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu, uayet。前18个月每月是20天,每月的第一天都用0表示,最后一个月,也就是第19个月,该月只有5天。这种纪年方式叫做Haab;但是因为宗教和信仰的原因,他们还有另一种纪年方式,叫做Tzolkin,这种纪年方式是每一天都有两种符号表示,有点类似于我们的干支纪年法,不同的是他们将此方法用来计算天,这两种符号分别是20个字母和13个数字,也就是260天一个轮回,20个字母分别是:imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau。13个数字就是1到13。

题目的要求是,给出Haab的某年某月的某一天,能换算出这一天在Tzolkin纪年方式中怎么表示。

分析题目,其实,解决的思路就比较明确,就是通过Haab的表示,算出目前总共经历了多少天,然后,根据Tzolkin的纪年方式,表示出这天对应的表示方式。如Haab中的

0. pop 0表示第一年的第一个月的第一天,他与Tzolkin中的:1 imix 0表示的意义相同。先通过Haab的运算求出总的天数,然后,利用除法,算出Tzolkin下的年份,再利用分别求余数的方法,算出两种符号分别是什麽。

这道题注意的是,两种纪年方式的年份都是从0开始,Haab每个月的天是从0开始计算的,而Tzolkin的数字是从1开始的。如果用字符数组表示的话,也应该注意角标的问题。另外,最重要的是,一定考虑在求余为0的时候,和年份(260)相除为0的情况下,最好临界值结果的修正。

相关代码:

#include <stdio.h>
#include <string.h>
int main()
{
    int i=0,j=0;
    int m_num=0;
    int sum_days=0;
    char Haab[19][10]={"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", "yax", "zac", "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu",  "uayet"};
    char m_Haab[10];
    int Ha_year=0,Ha_date=0;
    char Tzolkin[20][10]={"ahau", "imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik", "lamat", "muluk", "ok", "chuen", "eb", "ben", "ix", "mem", "cib", "caban", "eznab", "canac"};
    char m_Tzolkin[10];
    int Tzo_year=0,Tzo_date=0,Tzo_priod=0;
    scanf("%d",&m_num);
    printf("%d\n",m_num);
    for(i=0;i<m_num;i++)
    {
        scanf("%d. %s %d",&Ha_date,m_Haab,&Ha_year);
        Ha_date++;
        for(j=0;strcmp(Haab[j],m_Haab);j++);
        sum_days = Ha_date + j*20 + 365*Ha_year;
        Tzo_year = sum_days/260;
        if((sum_days%260)==0){
            printf("13 ahau %d\n",Tzo_year-1);
        }
        else{
            Tzo_date = sum_days%13;
            if(Tzo_date==0){
                Tzo_date = 13;
            }
            Tzo_priod = sum_days%20;
            printf("%d %s %d\n",Tzo_date,Tzolkin[Tzo_priod],Tzo_year);
        }
    }
    return 0;
}