poj 1008

26 篇文章 0 订阅

题目概述:

有两种历法,Haab历和Tzolkin历

Haab历一年19个月,前18个月都是20天,每个月名称依次为pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu,最后一个月5天,名称为uayet,每个月第一天是0日,最后一天是19日或4日,历法元年为0年

Tzolkin历一年有260天,一天以时期和编号二者确定,有13个时期,名称为imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau,编号从1到20,从每年第一天(1 imix)开始,每天编号和时期都会递增到下一个,当到达末尾时会循环回首个名称/编号,历法元年为0年

输入:

第一行times,其后每行一个Haab历法表示的日期,以%dd%,%m%,%yy%表示日,月,年,则格式为

%dd%. %m% %yy%

注意%dd%后有一个点

输入有times组

限制:

年<5000

输出:

第一行一个整数times,其后每行一个字符串,对应Tzolkin历日期,以%ddd%,%mmmm%,%yyy%表示编号,时期,年,则格式为

%ddd% %mmmm% %yyy%

注意没有点号

多组输入之间没有空行

样例输入:

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

样例输出:

3
3 chuen 0
1 imix 0
9 cimi 2801

讨论:

其实就是个计算题,不过扯上字符串就变得很烦人了,利用map和数组下标性质,还是个计算题

由于5天的特殊月在最后一个月,因此完全不影响计算

另外这里cin和printf混用了,但这两个并不影响

题解状态:

252K,0MS,C++,1315B

#include<algorithm>  
#include<string.h>  
#include<stdio.h>  
#include<iostream>
#include<map>
#include<string>
using namespace std;
#define INF 0x3f3f3f3f  
#define maxx(a,b) ((a)>(b)?(a):(b))  
#define minn(a,b) ((a)<(b)?(a):(b))  
#define MAXN 105

map<string, int>months;
char months2[20][10] = { "imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk","ok","chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau" };
void fun()
{
	int dd, mm, yy;
	char c;//放多余的点号
	string m;
	cin >> dd >> c >> m >> yy;//input//不知道scanf可否用string,于是用cin
	mm = months[m];//利用map还原为数字
	int days = 0;
	days += yy * 365 + mm * 20 + dd;//计算出过去多少天,这两行的状况只是意外,没有特殊含义
	int ddd, mmm, yyy;
	yyy = days / 260;
	days %= 260;
	mmm = days % 20;
	ddd = days % 13 + 1;//需要注意编号从1开始
	printf("%d %s %d\n", ddd, months2[mmm], yyy);
}
int main(void)
{
	//freopen("vs_cin.txt", "r", stdin);
	//freopen("vs_cout.txt", "w", stdout);

	months["pop"] = 0;
	months["no"] = 1;
	months["zip"] = 2;
	months["zotz"] = 3;
	months["tzec"] = 4;
	months["xul"] = 5;
	months["yoxkin"] = 6;
	months["mol"] = 7;
	months["chen"] = 8;
	months["yax"] = 9;
	months["zac"] = 10;
	months["ceh"] = 11;
	months["mac"] = 12;
	months["kankin"] = 13;
	months["muan"] = 14;
	months["pax"] = 15;
	months["koyab"] = 16;
	months["cumhu"] = 17;
	months["uayet"] = 18;//可以看到月份都减一了,因为月份记录已经完整经过的月数

	int times;
	cin >> times;//input
	printf("%d\n", times);//output
	while (times--) {
		fun();
	}
}

EOF

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值