POJ 1008 玛雅日历
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 72250 Accepted: 22225
描述
瑪雅文明使用365天的年歷,稱為Haab歷法,有19個(gè)月,前18個(gè)月都是20天,月名為: pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu.不考慮月名,每個(gè)月中,每天標(biāo)記為0,1,… , 19.Haab的最后一個(gè)月稱為uayet ,每天標(biāo)記為0,1,2,3,4?,斞湃讼嘈胚@個(gè)月是不幸的。
出于宗教目的,瑪雅使用另一種日歷,一年稱為Tzolkin (holly year)。一年被分為13個(gè)區(qū)間,每個(gè)區(qū)間20天。每天被標(biāo)記為(day_number,day_name)使用13個(gè)day_number(數(shù)字1~13)和20個(gè)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同時(shí)循環(huán))
請注意每一天都有明確的描述,例如:
在年初具有如下表示:
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, 繼續(xù)進(jìn)入下個(gè)20循環(huán) 8 imix, 9 ik, 10 akbal …
在Haab和Tzolkin的中,年都被數(shù)組0,1,…,標(biāo)記,數(shù)字0是世界的開始。因此,第一天是:
Haab: 0. pop 0
Tzolkin: 1 imix 0
編寫一個(gè)程序,將日期從Haab轉(zhuǎn)換為Tzolkin
輸入
Haab日期輸入的格式:NumberOfTheDay. Month Year
第一行是輸入的日期的個(gè)數(shù),之后的n行包含n個(gè)Haab日期,輸入的年小于5000.
輸出
Tzolkin日期輸出的格式:Number NameOfTheDay Year
第一行是輸出的日期的個(gè)數(shù),之后的n行包含n個(gè)Tzolkin日期,輸出的順序?qū)?yīng)輸入的日期
輸入樣例
3
10. zac 0
0. pop 0
10. zac 1995
輸出樣例
3
3 chuen 0
1 imix 0
9 cimi 2801
思路:
從世界開始時(shí)經(jīng)歷的總天數(shù)sumday
sumday=年*365+月份*20+日+1,
其中,
年:是輸入的年份,因?yàn)閺?開始計(jì)數(shù),所以已經(jīng)默認(rèn)減去1
月份:由于存在數(shù)組中,數(shù)組的下表從0開始計(jì)數(shù),所以已經(jīng)默認(rèn)減去1
日:由于輸入的日從0開始計(jì)數(shù),所以應(yīng)該+1則為真實(shí)的天數(shù)
結(jié)果的天數(shù)是sumday%13,如果結(jié)果為0則輸出13(Tzolkin的13循環(huán)從1開始計(jì)數(shù))
結(jié)果的天名是sumday%20,如果結(jié)果為0則對應(yīng)的是第20天,只要處理一下天名的數(shù)組,將第20天放在下標(biāo)0處即可。
結(jié)果的年份是sumday/260,注意!是當(dāng)給出的sumday恰好是260時(shí),輸出年份是0年,此時(shí)正確,但如果是是260的2倍或者以上倍數(shù),即:
sumday == x*260 (x>1, x為整數(shù)),
則輸出年份應(yīng)為x-1。
所以經(jīng)過統(tǒng)一的處理:輸出的Tzolkin日歷的年份應(yīng)為:
(sumday-1)/260
c++實(shí)現(xiàn)
#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個(gè)位置,因?yàn)槿∮噙\(yùn)算結(jié)果為0時(shí)表示第20天 int find_month(char* month){for(int i = 0; i <20; i++){if(!strcmp(month, hmonth[i])){return i;//hmonth在數(shù)組中從0開始計(jì)數(shù)}}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);//月份對應(yīng)的數(shù)字已經(jīng)減去1int sumday = year*365+imonth*20+day+1;//day從0開始計(jì)數(shù)int tyear = (sumday-1)/260;//當(dāng)年份為260的2倍及以上整數(shù)倍時(shí),不-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
總結(jié)
以上是生活随笔為你收集整理的POJ 1008 玛雅日历的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java实现简单泡泡屏保动画及点击变实心
- 下一篇: 个人的收藏夹