【洛谷 P8738】[蓝桥杯 2020 国 C] 天干地支 题解(字符串+数学+模运算)

[蓝桥杯 2020 国 C] 天干地支

题目描述

古代中国使用天干地支来记录当前的年份。

天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊
(wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。

地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、亥(hài)。

将天干和地支连起来,就组成了一个天干地支的年份,例如:甲子。2020 年是庚子年。

每过一年,天干和地支都会移动到下一个。例如 2021 年是辛丑年。

每过 60 年,天干会循环 6 轮,地支会循环 5 轮,所以天干地支纪年每 60年轮回一次。例如 1900 年,1960 年,2020 年都是庚子年。

给定一个公元纪年的年份,请输出这一年的天干地支年份。

输入格式

输入一行包含一个正整数,表示公元年份。

输出格式

输出一个拼音,表示天干地支的年份,天干和地支都用小写拼音表示(不表示声调),之间不要加入任何多余的字符。

样例 #1

样例输入 #1

2020

样例输出 #1

gengzi

提示

对于所有评测用例,输入的公元年份为不超过 9999 9999 9999 的正整数。

蓝桥杯 2020 年国赛 C 组 F 题。


思路

在天干地支系统中,每60年一个循环,也就是说天干地支的组合有60种可能。在这60种可能中,庚子(对应的天干地支索引为36)在公元1900年出现,且每60年出现一次。因此,可以将公元1900年看作是天干地支系统的一个起点。

因为要保证数组的索引从0开始,所以需要对年份进行一定的调整。将输入的年份与56相加,然后对60取余。如果将1900年作为起点(即索引0),那么2020年(又是一个庚子年)就是第120年,对应的索引应该是60。但在0开始的索引系统中,想要使2020年对应的索引为0,就需要对年份进行调整,使得1900年和2020年都能对应到索引0。通过分析,可以发现将年份加56可以达到这个效果。所以,(n + 56) % 60的结果就是给定公元年份对应的天干地支的索引。

首先,定义了两个字符串数组,分别表示天干和地支的拼音。然后,从输入中读取年份。通过 (n + 56) % 60 计算出天干地支的索引,这是因为1900年是庚子年,也就是第36个天干地支年,而2020年是庚子年,也就是第60个天干地支年,所以需要加56使得1900年对应到索引0。然后,使用模运算得到天干和地支的索引,输出对应的天干地支拼音。


AC代码

#include <algorithm>
#include <cmath>
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;

const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;

int n;
const string tiangan[] = {"jia", "yi",	 "bing", "ding", "wu",
						  "ji",	 "geng", "xin",	 "ren",	 "gui"},
			 dizhi[] = {"zi", "chou", "yin",  "mao", "chen", "si",
						"wu", "wei",  "shen", "you", "xu",	 "hai"};

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin >> n;
	// (n + 36 - 1900 + 1920) % 60
	int t = (n + 56) % 60;
	// cout << (t % 10) << " " << (t % 12) << endl;
	cout << tiangan[t % 10] << dizhi[t % 12] << "\n";
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值