这道题目也是一道水题,但是好特别注意一年中的最后一天,可能会出现错误。
代码如下:
#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再处理。