2012蓝桥杯【初赛试题】干支纪年

时间:2022-04-11 12:25:55

题目描述:

    在我国古代和近代,一直采用干支法纪年。它采用10天干和12地支配合,一个循环周期为60年。

    10天干是:甲,乙,丙,丁,戊,己,庚,辛,壬,癸
    12地支是:子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥

    如果某年是甲子,下一年就是乙丑,再下是丙寅,......癸酉,甲戌,乙亥,丙子,....

    总之天干、地址都是循环使用,两两配对。

    今年(2012)是壬辰年,1911年辛亥革命

    下面的代码根据公历年份输出相应的干支法纪年。已知最近的甲子年是1984年。

程序分析:

关键点是题目中的“循环使用,两两配对”这句话,循环使用就是除k取余

程序代码:

void f(int year)
{
char* x[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
char* y[] = {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};

int n = year - 1984;

while(n<0) n += 60;

printf("%s%s\n", x[n%10], y[n%12]);
}

int main(int argc, char* argv[])
{
f(1911);
f(1970);
f(2012);
return 0;
}

程序输出:

辛亥
庚戌
壬辰

我们还可以通过下面的程序,输出一个循环周期:

#include<iostream>
using namespace std;
int main()
{
char* x[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
char* y[] = {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
int n=0;
while(n+1<61)
{
cout<<n+1<<"";
cout<<x[n%10]<<y[n%12]<<endl;
n++;
}
}

程序输出:

1       甲子
2       乙丑
3       丙寅
4       丁卯
5       戊辰
6       己巳
7       庚午
8       辛未
9       壬申
10      癸酉
11      甲戌
12      乙亥
13      丙子
14      丁丑
15      戊寅
16      己卯
17      庚辰
18      辛巳
19      壬午
20      癸未
21      甲申
22      乙酉
23      丙戌
24      丁亥
25      戊子
26      己丑
27      庚寅
28      辛卯
29      壬辰
30      癸巳
31      甲午
32      乙未
33      丙申
34      丁酉
35      戊戌
36      己亥
37      庚子
38      辛丑
39      壬寅
40      癸卯
41      甲辰
42      乙巳
43      丙午
44      丁未
45      戊申
46      己酉
47      庚戌
48      辛亥
49      壬子
50      癸丑
51      甲寅
52      乙卯
53      丙辰
54      丁巳
55      戊午
56      己未
57      庚申
58      辛酉
59      壬戌
60      癸亥