poj1008"Maya Calendar"解题报告

本文介绍了一种简单的日历时间转换算法,通过计算两个不同日历系统间的日期转换。该算法首先将输入的日历时间转换为天数,再将天数转换为目标日历系统的日期,并特别注意了边界情况和细节处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题思路很简单,就是一个转化的问题,我的思路:

(1)根据给定的第一个日历时间,计算出从开始距今的天数;

(2)根据计算出的天数,再将此转换为第二个日历对应的日期;

(3)输出格式化,一定要注意要输出总的输入数。

题目虽不难,但也wr了好几次,刚开始是忽略了当计算出的天数恰好是第二个日历给对应的一年的最后一天的处理。

还有一个细节是最主要的,最后才发现,在我的代码中,month和day都是求余数所得,所以不可能是20和13,所以当month和day为零时,忘记了将month赋20,以及将day赋13,这个导致我wr了好几次。下面附上自己的代码,供大家参考:

#include<iostream>
#include<string>
using namespace std;

//将dStr转化成对应的整形的日
int StrToDay(string dStr);
//将mStr转化成对应的整形的月
int StrToMonth(string mStr);
//将整数的月转换成相应的字符串
string MonthToStr(int month);

int main()
{
	//freopen("in.txt","r",stdin);
	int n;
	cin>>n;
	string dStr,mStr;
	int year;
	int month;
	int day;
	cout<<n<<endl;
	for(int i=0;i<n;++i)
	{
		cin>>dStr>>mStr>>year;
		day=StrToDay(dStr);
		month=StrToMonth(mStr);
		int total=0;
		total=year*365+month*20+day;
		//将年月日转化为所要求的年历
		year=total/260;
		int temp=total-year*260;
		month=temp%20;
		day=temp%13;
		if(0==temp)
		{
			cout<<13<<" "<<"ahau "<<(year-1)<<endl;
			continue;
		}
		//注意此处if语句
		if(0==day)
			day=13;
		cout<<day<<" "<<MonthToStr(month)<<" "<<year<<endl;
	}
	return 0;
}

int StrToDay(string dStr)
{
	int day=0;
	if("0."==dStr)	day=1;
	if("1."==dStr)	day=2;
	if("2."==dStr)	day=3;
	if("3."==dStr)	day=4;
	if("4."==dStr)	day=5;
	if("5."==dStr)	day=6;
	if("6."==dStr)	day=7;
	if("7."==dStr)	day=8;
	if("8."==dStr)	day=9;
	if("9."==dStr)	day=10;
	if("10."==dStr)	day=11;
	if("11."==dStr)	day=12;
	if("12."==dStr)	day=13;
	if("13."==dStr)	day=14;
	if("14."==dStr)	day=15;
	if("15."==dStr)	day=16;
	if("16."==dStr)	day=17;
	if("17."==dStr)	day=18;
	if("18."==dStr)	day=19;
	if("19."==dStr)	day=20;
	return day;
}

int StrToMonth(string mStr)
{
	int month=0;
	if("pop"==mStr) month=0;
	if("no"==mStr) month=1;
	if("zip"==mStr) month=2;
	if("zotz"==mStr) month=3;
	if("tzec"==mStr) month=4;
	if("xul"==mStr) month=5;
	if("yoxkin"==mStr) month=6;
	if("mol"==mStr) month=7;
	if("chen"==mStr) month=8;
	if("yax"==mStr) month=9;
	if("zac"==mStr) month=10;
	if("ceh"==mStr) month=11;
	if("mac"==mStr) month=12;
	if("kankin"==mStr) month=13;
	if("muan"==mStr) month=14;
	if("pax"==mStr) month=15;
	if("koyab"==mStr) month=16;
	if("cumhu"==mStr) month=17;
	if("uayet"==mStr) month=18;
	return month;
}

string MonthToStr(int month)
{
	string str="";
	//注意此处if语句
	if(0==month)
		month=20;
	switch(month)
	{
	case 1: str="imix"; break;
	case 2: str="ik"; break;
	case 3: str="akbal"; break;
	case 4: str="kan"; break;
	case 5: str="chicchan"; break;
	case 6: str="cimi"; break;
	case 7: str="manik"; break;
	case 8: str="lamat"; break;
	case 9: str="muluk"; break;
	case 10: str="ok"; break;
	case 11: str="chuen"; break;
	case 12: str="eb"; break;
	case 13: str="ben"; break;
	case 14: str="ix"; break;
	case 15: str="mem"; break;
	case 16: str="cib"; break;
	case 17: str="caban"; break;
	case 18: str="eznab"; break;
	case 19: str="canac"; break;
	case 20: str="ahau"; break;
	default:
		break;
	}
	return str;
}


给大家附上一个测试用例:

input:

4. uayet 259

output:

13 ahau 364

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值