POJ 1008 Maya Calendar

这道题目也是一道水题,但是好特别注意一年中的最后一天,可能会出现错误。

代码如下:

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


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

	int i,j;
	int n;
	while(scanf("%d",&n) != EOF)
	{
		int day,year;
		int sum;
		char month[7];
		int outDayNum,outYear;
		char *outDay;
		int tmp;

		printf("%d\n",n);//打印要输出的行数
		for( i=0; i<n; i++)
		{
			scanf("%d. %s %d",&day,month,&year);
			for ( j=0; j<18; j++)
			{
				if (strcmp(month,haab[j]) == 0)
				{
					break;
				}
			}
//------------------------------------------------
			sum = year*365 + j*20 + day + 1;//因为是从零开始计数的
			outYear = sum / 260;
			sum -= outYear * 260;
			if (sum == 0)
			{
				outYear --;
				sum = 260;
			}
			outDayNum = (sum % 13 == 0) ? 13 : (sum % 13);
			tmp = (sum % 20 == 0) ? 20 : sum % 20;
			outDay = holly[tmp - 1];
			//outDayNum = sum % 13 + 1;
			//outDay = holly[sum % 20];
//----------------------------------------------------

			printf("%d %s %d\n",outDayNum,outDay,outYear);
		}
	}

	return 0;
}

从这到题目延伸开来,有个点比较好玩,那就是一个进制问题。

来打个比方,比如20进制,数从1到20,然后进位。给你一个数101,按照平常的想法就是说,

高位=101/20=5;低位=101%20=1。那么这种写法应该是没问题的。

但是给你一个100呢?

也这样处理? 那么高位是5 低位是0 而我给的这种进制里面是不存在0这个数的。


其实说的正常点的就是,像上题中的循环问题,以13为周期,数字从1到13。开始的时候没注意,按照原来的方法写,导致一年中的最有一天出现的偏差。

活着说,如果直接写成num%13 那么就不存在13这个数了,而会多出0,所以采取了上面的写法:

outDayNum = (sum % 13 == 0) ? 13 : (sum % 13);
但是怎么看,怎么感觉繁琐。


换个方式看看,我们把最大的数先-1,再处理。

如上面给定的100,先减去-1就是99,再处理,那么就是 高位是4,低位是19,再将低位加1,就成了20。

我们这题被下面符号标记出来的

//----------------------------------------------------
代码可以改写成:

sum = year*365 + j*20 + day ;//这里的1就不加了
			outYear = sum / 260;
			sum -= outYear * 260;
			outDayNum = sum % 13 + 1;
			outDay = holly[sum % 20];
就完成了,或许这样的改写会简单很多。


那么低位进制为从2到21,同样的,数字过来先减去2再处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值