[蓝桥杯 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;
}
标签:60,年份,题解,天干地支,蓝桥,索引,2020,1900
From: https://blog.csdn.net/qq_34988204/article/details/137118685