POJ 1008 Maya Calendar

原创 2012年03月26日 16:48:32

题目:玛雅使用两种日历,第一种称为Haab,一年为365天,一年分为19个月,前18个月每个月都是20天,第19个月为5天,每一个月都有一个名字,分别为pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu和uayet,每个月份中的天数用0到19表示。最后一个月份中的天数用0到4表示。玛雅使用的第二个日历称为Tzolkin,在这个日历中,一年为260天,一年分为13段,每段20天(260=13*20),每一天用一个数字和一个名字表示,总共20个名字: imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau,数字为1到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开始,从日期开始点开始,第一天在两种日历中分别为:

       Haab:0. pop 0

       Tzolkin: 1 imix 0

输入:输入的日期为Haab日历格式,第一行输入日期的个数,第二行开始输入日期。输入日期的格式为:

            天数.月份 年份    例如: 10. zac 0,天数和年份都从0开始

输出:输出的日期为Tzolkin日历格式。第一行输出日期的个数,第二行开始输出Tzolkin格式的日期,输出日期的格式为:

             数字 天名字 年份    例如:3 chuen 0, 数字为1到13,年份从0开始

解题思路:

1 先将输入的日期转换为距离日期开始点的天数:

   date = year*365+month*20+天数 

2 根据date求出Tzolkin日历格式的年份,月份,天数

  year = date/260;

  date = date%260;

  数字=date%13+1; (加1是因为数字从1开始)

  天名字下标=date%20;(20个天名字的下标从0到19,根据计算出的天名字下标就可以得到相应的天名字)

3 将转换后的结果输出到链表中保存,以便所有日期转换完成后一次性输出。


代码:

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

char *Haab[] = {"pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", "yax", "zac", 
                "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu", "uayet"};
char *Tzolkin[] = {"imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik", "lamat", "muluk", "ok",
                   "chuen", "eb", "ben", "ix", "mem", "cib", "caban", "eznab", "canac", "ahau"};

struct result
{
	char s[24];
	struct result *next;
};

//在一个字符串数组中搜索指定字符串的下标 
int searchStr(char *list[], int n, char *str)
{
	int i;
	for(i=0; i<n; i++)
	{
		if(strcmp(list[i],str)==0)
		{
		  return i;
		}
	}
	return -1;
}

int main()
{
	int day,month,year,date,n,i;
	char s[24];
	struct result *head=NULL,*p;
	struct result *tail=NULL;
	
	scanf("%d",&n);
	
	for(i=0; i<n; i++)
	{
	  scanf("%d. %s %d",&day, s, &year);
	
	  month = searchStr(Haab, 19, s);
	  date = year*365+month*20+day;
	
	  //进行日历转换
	  year = date/260; 
	  date = date%260;
	  day = date%13 + 1;
	  month = date%20;
	  
	  //保存转换结果 
	  if(head==NULL)
	  {
		head=tail = (struct result *)malloc(sizeof(struct result));
		tail->next = NULL;
	  }
	  else
	  {
		tail->next = (struct result *)malloc(sizeof(struct result));
		tail = tail->next;
		tail->next = NULL;
	  }
	  sprintf(tail->s,"%d %s %d", day, Tzolkin[month], year);
    }
    
    //输出
	printf("%d\n",n); 
	p = head;
	while(p != NULL)
	{
		printf("%s\n",p->s);
		p = p->next;
	}
	
	
	return 0;
}



相关文章推荐

POJ1008 玛雅历

POJ1008 玛雅历 Description 上周末,M.A. Ya教授对古老的玛雅有了一个重大发现。从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Ha...
  • Lxp__
  • Lxp__
  • 2015年12月22日 22:31
  • 1110

POJ1008-Maya Calendar

转载请注明出处:優YoU   http://user.qzone.qq.com/289065406/blog/1309435560   大致题意: 有中文版= = 我不多说   解题思路...

POJ 1008(模拟)

最后一天特判 Program P1008; var n,i,j1,j2,j,day,month,year:longint; daytotal,tday,tmonth,tyear:...

POJ1008 模拟

0) 题意:  给出两种日历的规则,写出转换的程序。模拟,注意细节!考验编码能力,比如从0或1开始,如果是某年最后一天的处理等,这种题不能1y都要罚时的话就太不应该了。 1) #includ...

poj1008

玛雅历 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 59578   Accepted: 18352 D...
  • dragoo1
  • dragoo1
  • 2013年07月22日 23:44
  • 726

poj1008(Maya Calendar)玛雅历(c++实现)

这道题目不难,就是简单的模拟算法。
  • yzj577
  • yzj577
  • 2014年07月18日 09:16
  • 779

POJ1008解题报告

中文题。看了之后大概意思就是日历A按照某某方式计算(每年365天),日历B按照某某方式计算...

POJ1008算法解析

POJ1008 Description 上周末,M.A. Ya教授对古老的玛雅有了一个重大发现。从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做H...

Maya Calendar

Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 70016   ...

北大 1008 Maya Calendar——做到这里的一点心得

Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 60309   ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1008 Maya Calendar
举报原因:
原因补充:

(最多只允许输入30个字)