天干地支(详解)

文章描述了一个C语言程序,该程序根据输入的公元年份计算并输出对应的天干地支纪年。程序首先定义了天干和地支的字符数组,然后通过计算年份对60的余数来确定对应的天干和地支,最后组合输出。在优化算法中,通过调整数组初始值,直接用年份模10和模12的结果索引数组得到答案。
摘要由CSDN通过智能技术生成

题目描述

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

天干一共有十个,分别为:甲(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)。

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

20202020 年是庚子年。

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

每过 6060 年,天干会循环 66 轮,地支会循环 55 轮,所以天干地支纪年每 6060 年轮回一次。例如 19001900 年,19601960 年,20202020 年都是庚子年。

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

输入描述

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

其中有 ,输入的公元年份为不超过 99999999 的正整数。

输出描述

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

输入输出样例

示例
输入
2020
输出
gengzi

运行限制

  • 最大运行时间:1s

  • 最大运行内存: 128M

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 char * tiangan[10] = {"jia","yi","bing","ding","wu","ji","geng","xin","ren","gui"};
 char * dizhi[12] = {"zi","chou","yin","mou","chen","si","wu","wei","shen","you","xu","hai" };
 //要么指针数组要么二维数组,因为一个数组空间只能放一个字母,长串字符要么就用指针代替,要么就用二维
 //一个一个字符放,用行代表一个字符串
//  char b[10][10]={"jia","yi","bing","ding","wu","ji","geng","xin","ren","gui"};
// char a[12][10]={"zi","chou","yin","mao","chen","si","wu","wei","shen","you","xu","hai"};
  int n,j,k;
  scanf("%d",&n);
  int c=n%60;
  //计算n的余数来压缩遍历范围,再通过循环移动下标,
  //得到正确的下标后输出
  if(c==40)
  //庚子年时余数是40
  {
    printf("%s%s",tiangan[6],dizhi[0]);
  }
else if(c<40)
{
    j=6;
    k=0;;//初始化,只移动下标就行了
    //标记庚子年的下标然后开始移动
    for(int i=0;i<40-c;i++)
  {
    
  if(j==0)
  j=10;
  if(k==0)
  k=12;
   j--;
    k--;
   
  }
 
}
else
{
   j=6;
    k=0;//初始化,只移动下标就行了
    for(int i=0;i<c-40;i++)
  {
    if(j==9)
  j=-1;
  if(k==11)
  k=-1;
   j++;
    k++;
  }
  
  //对于这种你不清楚该怎么赋值,哪个代码该写在前面
  //你就自己假设带入要跳转的时刻的数据,自己按照程序的单个循环
  // 写出一个能实现自己想要的效果的代码就可以了
  //如j==9,k==11,我想在这个循环里实现跳转到0,0,我应该怎么做
  //就这么模拟实景就行了
  
}
printf("%s%s",tiangan[j],dizhi[k]);
//递减还是递增如何实现到尽头时自动跳转太麻烦,用循环算法太复杂
//笑死,你还是把它写出来了
  return 0;
}

递减还是递增如何实现到尽头时自动跳转太麻烦,用循环算法太复杂

优化算法

//前面一直卡住我们的是下标转移不好移
//通过求余数发现公元40年是庚子年
//所以我们可以自行往前推,求出公元0年时
//是什么年,然后把公元一年作为第一,
//第0年就和数组下标同步了
//数据导入到数组,然后我们就可以通过
//求余直接得出答案

// 即:利用下标和年同步,用求余实现自动转一下标!

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 char * tiangan[10] = {"geng", "xin", "ren", "gui", "jia", "yi" , "bing", "ding", "wu", "ji"};
 char * dizhi[12] = {"shen", "you", "xu", "hai", "zi", "chou", "yin", "mou", "chen", "si", "wu", "wei"};
 int n;
 scanf("%d",&n);

printf("%s%s",tiangan[n%10],dizhi[n%12]);

  return 0;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值