POJ 1008 Maya Calendar

题目:玛雅使用两种日历,第一种称为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;
}



你可能感兴趣的:(Date,struct,list,calendar,null,日历)