洛谷 P8738:[蓝桥杯 2020 国 C] 天干地支 ← string

【题目来源】
https://www.luogu.com.cn/problem/P8738

【题目描述】
古代中国使用天干地支来记录当前的年份。
天干一共有十个,分别为:甲(jiǎ)、乙(yi))、丙(bing)、丁(ding)、戊(wù)、己(j))、庚(gēng)、辛(xin)、壬(rén)、癸(guì)。
地支一共有十二个,分别为:子(zi)、丑(chou)、寅(yin)、卯(măo)、辰(chén)、已(si)、午(wü)、未(wèi)、申(shen)、酉(you)、戌(xu)、亥(hài)。
将天干和地支连起来,就组成了一个天干地支的年份,例如:甲子。2020 年是庚子年。
每过一年,天干和地支都会移动到下一个。例如 2021 年是辛丑年。
每过 60 年,天干会循环6轮,地支会循环 5 轮,所以天干地支纪年每60年轮回一次。例如 1900 年,1960 年,2020 年都是庚子年。
给定一个公元纪年的年份,请输出这一年的天干地支年份。

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

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

【输入样例】
2020

【输出样例】
gengzi

【数据范围】
对于所有评测用例,输入的公元年份为不超过 9999 的正整数。
蓝桥杯 2020 年国赛 C 组 F 题。

【算法分析】
● 天干地支
天干:"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"
地支:"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"

● 通用计算公式(公元后通用)
在上文序号以 1 开始的天干地支前提下,给定任意公历年份 Y,天干序号 = (Y - 3) ÷ 10 的余数地支序号 = (Y - 3) ÷ 12 的余数
但考虑到 C++ 数组的下标从 0 开始,所以如上天干序号、地支序号的计算公式修正为:
(1)天干序号 = (Y - 4) ÷ 10 的余数
(2)地支序号 = (Y - 4) ÷ 12 的余数
但要注意,当 Y 取 1、2、3 时,Y - 4 为负数,故有了下文 getIndex 函数中 idx 是否小于 0 的判断。

【算法代码】

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

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

int getIndex(int x,int mod) {
    int idx=x%mod;
    return idx<0?idx+mod:idx;
}

int main() {
    int n;
    cin>>n;
    int tgIndex=getIndex(n-4,10);
    int dzIndex=getIndex(n-4,12);

    string tg=t[tgIndex];
    string dz=d[dzIndex];
    cout<<tg<<dz<<endl;

    return 0;
}

/*
in:2020
out:gengzi
*/

【参考文献】
https://mp.weixin.qq.com/s/8ZZiiHuEM6VmjvgHJzjaOA
https://www.luogu.com.cn/problem/solution/P8738

相关推荐
Ivanqhz2 天前
NFM(神经因子分解机)
开发语言·javascript·人工智能·算法·蓝桥杯
变量未定义~6 天前
单调栈、单调队列(模板)、子矩阵(模板)
数据结构·算法·蓝桥杯
智者知已应修善业8 天前
【P12159蓝桥杯数组翻转】2025-4-24
c语言·c++·经验分享·笔记·算法·蓝桥杯
码云数智-大飞10 天前
从 OC 平滑迁移 Swift 完整方案
职场和发展·蓝桥杯
csdn_aspnet10 天前
C# 提取、截取或匹配字符串内包含指定字符的一些方法分享
c#·字符串·正则·分割·提取·匹配
csdn_aspnet10 天前
C# 截取或匹配字符串内包含指定字符的一些方法
c#·字符串·分割·string·匹配·截取
csdn_aspnet11 天前
C# 截取或匹配字符串内包含指定字符
c#·字符串·正则·string·匹配·截取
Tisfy13 天前
LeetCode 1358.包含所有三种字符的子字符串数目:滑动窗口(两种写法直接推荐方法二)
算法·leetcode·字符串·题解·滑动窗口
嘿黑嘿呦1 个月前
chap 8排序
算法·蓝桥杯·排序算法·软件工程
林森lsjs1 个月前
【日耕一题】5. 青春常数(17届蓝桥杯C++B组第一题)
算法·蓝桥杯