1. 程式人生 > >Bailian2965 瑪雅歷【日期計算】

Bailian2965 瑪雅歷【日期計算】

2965:瑪雅歷
總時間限制: 1000ms 記憶體限制: 65536kB

描述
上週末,M.A. Ya教授對古老的瑪雅有了一個重大發現。從一個古老的節繩(瑪雅人用於記事的工具)中,教授發現瑪雅人使用了一個一年有365天的叫做Haab的歷法。這個Haab曆法擁有19個月,在開始的18個月,一個月有20天,月份的名字分別是pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu。這些月份中的日期用0到19表示。Haab歷的最後一個月叫做uayet,它只有5天,用0到4表示。瑪雅人認為這個日期最少的月份是不吉利的,在這個月法庭不開庭,人們不從事交易,甚至沒有人打掃屋中的地板。

因為宗教的原因,瑪雅人還使用了另一個曆法,在這個曆法中年被稱為Tzolkin(holly年),一年被分成13個不同的時期,每個時期有20天,每一天用一個數字和一個單詞相組合的形式來表示。使用的數字是1~13,使用的單詞共有20個,它們分別是:imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau。注意:年中的每一天都有著明確唯一的描述,比如,在一年的開始,日期如下描述: 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,1,……表示,數字0表示世界的開始。所以第一天被表示成:
Haab: 0. pop 0
Tzolkin: 1 imix 0
請幫助M.A. Ya教授寫一個程式可以把Haab歷轉化成Tzolkin歷。

輸入
Haab歷中的資料由如下的方式表示:
日期. 月份 年數

輸入中的第一行表示要轉化的Haab歷日期的資料量。下面的每一行表示一個日期,年數小於5000。

輸出
Tzolkin歷中的資料由如下的方式表示:
天數字 天名稱 年數

第一行表示輸出的日期數量。下面的每一行表示一個輸入資料中對應的Tzolkin歷中的日期。

樣例輸入
3

  1. zac 0
  2. pop 0
  3. zac 1995

樣例輸出
3
3 chuen 0
1 imix 0
9 cimi 2801

來源
POJ 1008

問題連結Bailian2965 瑪雅歷
問題簡述:(略)
問題分析
    本題與參考連結的題是同一題,程式碼可以直接AC。
程式說明:(略)
參考連結POJ1008 UVA300 UVALive5515 Maya Calendar【日期計算】
題記:(略)

AC的C語言程式如下:

/* POJ1008 UVA300 UVALive5515 Maya Calendar */

#include <stdio.h>
#include <string.h>

#define N 10

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"};
char month[N];

int main(void)
{
    int n, day, year, i;
    scanf("%d", &n);
    printf("%d\n", n);
    while(n--) {
        scanf("%d. %s %d", &day, month, &year);     /* 讀入Haab歷的年月日 */
        for(i = 0; i < 19; i++)
            if(!strcmp(month, Haab[i]))
                break;
        int days = year * 365 + i * 20 + day;
        printf("%d %s %d\n", 1 + days % 13, Tzolkin[days % 20], days / 260);
    }

    return 0;
}