【問題描述】
在學術休假期間,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曆法中類似於天干地支雙循環的問題。
邊界條件:
- haab的第一天從0開始。
- haab最後一個月有5天。
- 算法設計
通過上述分析,將採用下面的方法解決相關問題:
- 將haab曆法中的年月日,轉化成我們現在曆法中的總天數。
- 然後根據總天數換算成tzolkin曆法中的年月日。
- 詳細設計(從算法到程序)
- 設計結構體,分別存有haab的年月日,同時設置成員函數,計算出總天數。
- 使用string類型的字符串數組,記錄haab的各個年份,tzolkin的各個天數。
- 使用三重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
|
程序如下:
#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;
}