Maya曆法

【問題描述】

在學術休假期間,M.A. Ya教授在古老的Maya曆法上有一個驚人的發現。從一個古老的令人棘手的信息中,教授發現Maya文明以365天爲一年,稱爲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、1、2、3、4。瑪雅人認爲這個月是不吉利的,法院不開庭,貿易停止了,人們甚至停止清掃地板。

       出於宗教的目的,Maya人使用另外一套曆法,叫做Tzolkin(冬青年)。一年被分爲13個期間,每個期間20天。每天被表示爲由數字和日期名錶示的數對。使用20個名字:imix、ik、akbal、kan、chicchan、cimi、manik、lamat、muluk、ok、chuen、eb、ben、ix、mem、cib、caban、eznab、canac、ahau,以及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、1、...來表示,數字0是世界的開始。因此,第一天表示爲:

       Haab: 0. pop 0

      Tzolkin: 1 imix 0

      請幫M.A.Ya教授寫一個程序,將Haab日曆轉換爲Tzolkin日曆。  


【輸入形式】

       在Haab中日期用以下形式表示:

               NumberOfTheDay. Month Year

       輸入文件的第一行包含文件中輸入日期的數目。接下來的n行包含Haab日曆格式的n個日期,年份小於5000。


【輸出形式】

        Tzolkin日期用一下格式:

               Number NameOfTheDay Year

        輸出包括n行,按照與輸入日期對應的順序,輸出tzolkin日曆格式日期。 


【樣例輸入】

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

【樣例輸出】

3 chuen 0
1 imix 0
9 cimi 2801

  • 問題分析及邊界條件

要處理的問題:

1.如何將haab轉化爲tzolkin曆法。

2.如何處理tzolkin曆法中類似於天干地支雙循環的問題。

邊界條件:

  1. haab的第一天從0開始。
  2. haab最後一個月有5天。
  • 算法設計

通過上述分析,將採用下面的方法解決相關問題:

  1. 將haab曆法中的年月日,轉化成我們現在曆法中的總天數。
  2. 然後根據總天數換算成tzolkin曆法中的年月日。
  • 詳細設計(從算法到程序)
  1. 設計結構體,分別存有haab的年月日,同時設置成員函數,計算出總天數。
  2. 使用string類型的字符串數組,記錄haab的各個年份,tzolkin的各個天數。
  3. 使用三重for循環進行數字和日期的雙重循環的演化。
  • 樣例設計與測試

測試樣例一

hAAb曆法中的最後一個月

樣例輸入

3

2.uayet 12

5.uayet 156

0.uayet 23

樣例輸出

11 akbal 18

2 cimi 220

7 cib 33

測試樣例二

haab中的第一天

樣例輸入

2

0.mol 155

0.chen 45

樣例輸出

10 cib 218

11 cimi 63

測試樣例三

haab中的任意一天

樣例輸入

3

15.pax 2018

20.no 111

4.xul 951

樣例輸出

7 cimi 2834

9 cib 155

  1. ahau 135

程序如下:

#include<iostream>
#include<string>
using namespace std;
string sstr[19]={"pop","no","zip","zotz","tzec","xul","yoxkin","mol","chen","yax","zac","ceh","mac","kankin","muan","pax","koyab","cumhu","uayet"};
struct Haab
{
    int num;
    string month;
    int year;
    int sum_days;
    void sum_of_days()
    {
        sum_days=0;
        for(int i=0;sstr[i]!=month;i++)
        {
            sum_days+=20; 
        }
        sum_days+=num+1;
        sum_days+=year*365;
    }
};
int main()
{
    int n;
    cin>>n;
    Haab h[n];
    char ch;
    for(int i=0;i<n;i++) 
    {
        cin>>h[i].num>>ch>>h[i].month>>h[i].year;
        h[i].sum_of_days();
    }
    string str[20]={"imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk","ok","chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau"};
    for(int ii=0;ii<n;ii++)
    {
        int year=0;
        int i=0;
        int k=0;
        int c=0;
        bool flag=1;
        
        for(;flag;year++)
        {
            for(i=0;i<13&&flag;i++)  //error 條件要並列起來,不要用 ,號 
            {
                for(k=0;k<20;k++)
                {
                    h[ii].sum_days--;
                    c++;
                    if(c==14)
                    {
                        c=1;
                    }
                    if(h[ii].sum_days==0)
                    {
                        flag=0;
                        break;
                    }
                }
            }
        }
        cout<<c<<" "<<str[k]<<" "<<year-1<<endl;
    }
    return 0;
}

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