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

题目描述:

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

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

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

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

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

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


思路:已知干支法纪年第一个是”甲子“年,那么只要再看见一次”甲子“,就说明已经循环一个轮回了,

所以,我先输出一个轮回所有干支法纪年的名称。

操作代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int flag=1,x=0,i=0,j=0,k=1;
    char a[10][3]={"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
    char b[12][3]={"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
    while(flag)
    {
       printf("Case %d:",k++);
       if(i==10)
       i=0;
       printf("%s",a[i++]);
       if(j==12)
       j=0;
       printf("%s\n",b[j++]);
       if(i-1==0&&j-1==0)
       x++;
       if(x==2)
       flag=0;
    }
    system("pause");
    return 0;
}

答案:

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

原来干支纪年是60年一个轮回啊,又学到知识了


这样,每60年更新一次轮回,那么,以题目中”最近的甲子年是1984年“来看,应该这样写:

AC代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int flag=1,x=0,i=0,j=0,k=0,n;
    char a[10][3]={"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
    char b[12][3]={"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
    printf("请输入年份:");
    scanf("%d",&x);
    n=x-1984;
    while(n<0) n+=60; 
    while(flag)
    {
       k++;
       if(i==10)
       i=0;
       i++;
       if(j==12)
       j=0;
       j++;
       if(k-1==n)
       flag=0;
    }
    printf("%d年是%s%s年\n",x,a[i-1],b[j-1]);
    system("pause");
    return 0;
}

测试:

请输入年份:1911
1911年是辛亥年
请按任意键继续. . .

请输入年份:1984
1984年是甲子年
请按任意键继续. . .

请输入年份:2012
2012年是壬辰年
请按任意键继续. . .

你可能感兴趣的:(C++,C语言,ACM,OJ,干支纪年,2012蓝桥杯,初赛试题)