POJ 1008 瑪雅日曆

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 72250 Accepted: 22225

描述

瑪雅文明使用365天的年曆,稱爲Haab曆法,有19個月,前18個月都是20天,月名爲: pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu.不考慮月名,每個月中,每天標記爲0,1,… , 19.Haab的最後一個月稱爲uayet ,每天標記爲0,1,2,3,4。瑪雅人相信這個月是不幸的。

出於宗教目的,瑪雅使用另一種日曆,一年稱爲Tzolkin (holly year)。一年被分爲13個區間,每個區間20天。每天被標記爲(day_number,day_name)使用13個day_number(數字1~13)和20個day_name分別爲: imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau ;(day_number和day_name同時循環)

請注意每一天都有明確的描述,例如:
在年初具有如下表示:
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, 繼續進入下個20循環 8 imix, 9 ik, 10 akbal …

在Haab和Tzolkin的中,年都被數組0,1,…,標記,數字0是世界的開始。因此,第一天是:
Haab: 0. pop 0
Tzolkin: 1 imix 0
編寫一個程序,將日期從Haab轉換爲Tzolkin

輸入

Haab日期輸入的格式:NumberOfTheDay. Month Year
第一行是輸入的日期的個數,之後的n行包含n個Haab日期,輸入的年小於5000.

輸出

Tzolkin日期輸出的格式:Number NameOfTheDay Year
第一行是輸出的日期的個數,之後的n行包含n個Tzolkin日期,輸出的順序對應輸入的日期

輸入樣例

3
10. zac 0
0. pop 0
10. zac 1995

輸出樣例

3
3 chuen 0
1 imix 0
9 cimi 2801

思路:

從世界開始時經歷的總天數sumday
sumday=年*365+月份*20+日+1,
其中,
年:是輸入的年份,因爲從0開始計數,所以已經默認減去1
月份:由於存在數組中,數組的下表從0開始計數,所以已經默認減去1
日:由於輸入的日從0開始計數,所以應該+1則爲真實的天數
結果的天數是sumday%13,如果結果爲0則輸出13(Tzolkin的13循環從1開始計數)
結果的天名是sumday%20,如果結果爲0則對應的是第20天,只要處理一下天名的數組,將第20天放在下標0處即可。
結果的年份是sumday/260,注意!是當給出的sumday恰好是260時,輸出年份是0年,此時正確,但如果是是260的2倍或者以上倍數,即:
sumday == x*260 (x>1, x爲整數),
則輸出年份應爲x-1。
所以經過統一的處理:輸出的Tzolkin日曆的年份應爲:
(sumday-1)/260

c++實現

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

using namespace std;

const char hmonth[19][10] = {
    "pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin",
    "mol", "chen", "yax", "zac", "ceh", "mac", "kankin",
    "muan", "pax", "koyab", "cumhu","uayet"};
const char tzday[20][10] = { "ahau","imix", "ik", "akbal", "kan",
    "chicchan", "cimi", "manik", "lamat", "muluk", "ok",
    "chuen", "eb", "ben", "ix", "mem", "cib", "caban",
    "eznab", "canac"};//把第20天放在第0個位置,因爲取餘運算結果爲0時表示第20天
int find_month(char* month){
    for(int i = 0; i <20; i++){
        if(!strcmp(month, hmonth[i])){
            return i;//hmonth在數組中從0開始計數
        }
    }
    return -1;
}


int main()
{
    int ncase;
    cin >> ncase;
    cout << ncase << endl;
    int day,year;
    char month[10];//存放月份名

    for(int i = 0; i < ncase; i++){
        scanf("%d. %s %d", &day, &month, &year);
        int imonth = find_month(month);//月份對應的數字已經減去1
        int sumday = year*365+imonth*20+day+1;//day從0開始計數
        int tyear = (sumday-1)/260;//當年份爲260的2倍及以上整數倍時,不-1則輸出多了1年
        int tday = sumday%13;
        if(tday==0)
            tday=13;
        int tmonth = sumday%20;
        cout<< tday << " " << tzday[tmonth] << " " << tyear << endl;
    }
    return 0;
}

參考

http://blog.csdn.net/shaw1994/article/details/12308965
http://www.cnblogs.com/ay27/archive/2013/02/24/2924012.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章