poj1008

玛雅历
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 59578   Accepted: 18352

Description

上周末,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历。

Input

Haab历中的数据由如下的方式表示:
日期. 月份 年数

输入中的第一行表示要转化的Haab历日期的数据量。下面的每一行表示一个日期,年数小于5000。

Output

Tzolkin历中的数据由如下的方式表示:
天数字 天名称 年数

第一行表示输出的日期数量。下面的每一行表示一个输入数据中对应的Tzolkin历中的日期。

Sample Input

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

Sample Output

3
3 chuen 0
1 imix 0
9 cimi 2801
#include <iostream>
#include <string>
using namespace std;
int main()
{
	int lines=0;
	int i=0, j=0;
	char ret[5000][20];
	cin>>lines;
	string Haab[19] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", "yax", 
		"zac", "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu", "uayet"};
	string Tzol[20] = {"ahau", "imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik", "lamat", 
		"muluk", "ok", "chuen", "eb", "ben", "ix", "mem", "cib", "caban", "eznab", "canac"};
	for(i=0; i<lines; i++)
	{
		int idays=0, imonth=0;
		string s1,s2,s3;
		cin>>s1>>s2>>s3;
		for(j=0; j<19; j++)
		{
			if(s2 == Haab[j])
			{
				imonth = j;
				break;
			}
		}
		idays = 1+atoi(s1.c_str())+20*imonth+365*atoi(s3.c_str());
		int newday = idays%13;
		if(newday==0)
			newday = 13;
		int newmon = idays%20;
		int newyea = (idays-1)/260;
		sprintf(ret[i], "%d %s %d\0", newday, Tzol[newmon].c_str(), newyea);
	}
	printf("%d\n", lines);
	for(i=0; i<lines; i++)
		printf("%s\n", ret[i]);
	return 0;
}


成绩对比:

1    1572183    trymuchmore    4K    0MS    Pascal    852B     2006-09-09 17:48:39
10    2389903    xxsp    8K    0MS    C++    659B     2007-07-25 22:20:42
7552    11836232(2)    dragoo1    344K    0MS    C++     1040B     2013-07-22 21:58:59


其他代码: 

//http://blog.csdn.net/lyy289065406/article/details/6645413
//Memory Time    
//264K   0MS   
#include<iostream>  
using namespace std;  

/*得到Haab历月份对应的数字*/  
int GetMonth(char* month)  
{  
    int ASCII=0;  
    for(int i=0;month[i];i++)  
        ASCII+=month[i];  
	
    switch(ASCII)  
    {  
	case 335:return 1;  //pop  
	case 221:return 2;  //no  
	case 339:return 3;  //zip  
	case 471:return 4;  //zotz  
	case 438:return 5;  //tzec  
	case 345:return 6;  //xul  
	case 674:return 7;  //yoxkin  
	case 328:return 8;  //mol  
	case 414:return 9;  //chen  
	case 338:return 10;  //yax  
	case 318:return 11;  //zac  
	case 304:return 12;  //ceh  
	case 305:return 13;  //mac  
	case 636:return 14;  //kankin  
	case 433:return 15;  //muan  
	case 329:return 16;  //pax  
	case 534:return 17;  //koyab  
	case 546:return 18;  //cumhu  
	case 552:return 19;  //uayet  
    }  
}  
/*计算Haab历从第0天到现在的天数*/  
int HaabDay(int day,int month,int year)  
{  
    int sumday=0;  
    for(int i=0;i<year;i++) //Haab历法一年有365天  
        sumday+=365;  
	
    for(int j=1;j<month;j++)  
        sumday+=20;  
	
    return sumday+day;  
}  

int main(void)  
{  
    char TzolkinDayName_Str[21][10]={"0","imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk","ok","chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau"};  
    int day;  
    char doc;  //注意输入格式有 "."  
    char month[10];  
    int year;  
	
    int test;  
    cin>>test;  
    cout<<test<<endl;  
    while(test-- && (cin>>day>>doc>>month>>year))  //日期. 月份 年数  
    {  
        int sumday=HaabDay(day,GetMonth(month),year);  
		
        int TzolkinYear=sumday/260;   //Tzolkin历法一年有260天  
        int TzolkinDayName=sumday%20+1;  
        int TzolkinDayId=sumday%13+1;  
		
        cout<<TzolkinDayId<<' '<<TzolkinDayName_Str[TzolkinDayName]<<' '<<TzolkinYear<<endl;  
    }  
    return 0;  
} 


你可能感兴趣的:(poj1008)