0 0

求“天干地支”算法5

已知天干地支,求对应的数值。拒绝查表法,最好有Java代码。
谢谢

如,
已知 甲子 求得结果 1
已知 壬辰 求得结果 29

问题补充:
chen_yongkai 写道
我写了个,

import java.util.HashMap;

public class ChineseCalendar {
	private final static HashMap<Character, Integer> Heavenly_Stems = new HashMap<Character, Integer>();
	private final static HashMap<Character, Integer> Earthly_Branches = new HashMap<Character, Integer>();
	static {
		Heavenly_Stems.put('甲', 1);
		Heavenly_Stems.put('乙', 2);
		Heavenly_Stems.put('丙', 3);
		Heavenly_Stems.put('丁', 4);
		Heavenly_Stems.put('戊', 5);
		Heavenly_Stems.put('己', 6);
		Heavenly_Stems.put('庚', 7);
		Heavenly_Stems.put('辛', 8);
		Heavenly_Stems.put('壬', 9);
		Heavenly_Stems.put('癸', 10);

		Earthly_Branches.put('子', 1);
		Earthly_Branches.put('丑', 2);
		Earthly_Branches.put('寅', 3);
		Earthly_Branches.put('卯', 4);
		Earthly_Branches.put('辰', 5);
		Earthly_Branches.put('巳', 6);
		Earthly_Branches.put('午', 7);
		Earthly_Branches.put('未', 8);
		Earthly_Branches.put('申', 9);
		Earthly_Branches.put('酉', 10);
		Earthly_Branches.put('戌', 11);
		Earthly_Branches.put('亥', 12);
	}

	public static int getCode(String name) {
		int n = name.length();
		if (n < 2)
			throw new IllegalArgumentException("Unknown name: " + name);

		char h = name.charAt(0);
		Integer hCode = Heavenly_Stems.get(h);
		if (hCode == null)
			throw new IllegalArgumentException("Unknown name: " + name);
		char e = name.charAt(1);
		Integer eCode = Earthly_Branches.get(e);
		if (eCode == null)
			throw new IllegalArgumentException("Unknown name: " + name);
		hCode%=10;
		eCode%=12;
		for (int c = 1; c <= 60; c++) {
			if (c % 10 == hCode && c % 12 == eCode)
				return c;
		}
		throw new IllegalArgumentException("Unknown name: " + name);
	}

	public static void main(String[] args) {
		System.out.println(getCode("甲子"));
		System.out.println(getCode("壬辰"));
		System.out.println(getCode("癸酉"));
		System.out.println(getCode("癸亥"));
		
	}
}




其实用查表法是最好的

啊,for 循环计算啊。我原预期的直接通过数学计算一步到位的,就像数值推干支那样。不知道有没有呢?

问题补充:终于搞定,在网上找到了相关算法,其实就是“中国剩余定理”。
实现代码如下:
/**
 * <url>http://en.wikipedia.org/wiki/Sexagenary_cycle</url>
 */
public class Sexagenary {
	/**
	 * 输入干支,输出对应数值。
	 */
	public static int getValue(Stems stems, Branches branches) {
		int s = stems.ordinal() + 1;
		int b = branches.ordinal() + 1;

		int value = (6 * s - 5 * b + 60) % 60;
		return value;
	}
	
	/**
	 * 输入数值,输出对应干支(String)
	 */
	public static String getStemsBranches(int num) {
		if (num < 1 || num > 60) {
			throw new IllegalArgumentException("Error input, num:" + num);
		}

		int s = ((num % 10) == 0) ? 10 : (num % 10);
		int b = ((num % 12) == 0) ? 12 : (num % 12);
		
		Stems stems = Stems.values()[s - 1];
		Branches branches = Branches.values()[b - 1];

		return "" + stems + branches;
	}
		

	public static void main(String[] args) {
		System.out.println(Stems.甲);
		System.out.println(Sexagenary.getStemsBranches(1)); // 甲子
		System.out.println(Sexagenary.getStemsBranches(53)); // 丙辰
		System.out.println("" + Sexagenary.getValue(Stems.甲, Branches.子)); // 1
		System.out.println("" + Sexagenary.getValue(Stems.丙, Branches.辰)); // 53
		System.out.println("" + Sexagenary.getValue(Stems.戊, Branches.午)); // 55
	}
}

enum Stems {
	甲, 乙, 丙, 丁, 戊, 己, 庚, 辛, 壬, 癸;
}

enum Branches {
	子, 丑, 寅, 卯, 辰, 巳, 午, 未, 申, 酉, 戌, 亥;	
}

2011年10月08日 23:39

1个答案 按时间排序 按投票排序

0 0

采纳的答案

我写了个,


import java.util.HashMap;

public class ChineseCalendar {
	private final static HashMap<Character, Integer> Heavenly_Stems = new HashMap<Character, Integer>();
	private final static HashMap<Character, Integer> Earthly_Branches = new HashMap<Character, Integer>();
	static {
		Heavenly_Stems.put('甲', 1);
		Heavenly_Stems.put('乙', 2);
		Heavenly_Stems.put('丙', 3);
		Heavenly_Stems.put('丁', 4);
		Heavenly_Stems.put('戊', 5);
		Heavenly_Stems.put('己', 6);
		Heavenly_Stems.put('庚', 7);
		Heavenly_Stems.put('辛', 8);
		Heavenly_Stems.put('壬', 9);
		Heavenly_Stems.put('癸', 10);

		Earthly_Branches.put('子', 1);
		Earthly_Branches.put('丑', 2);
		Earthly_Branches.put('寅', 3);
		Earthly_Branches.put('卯', 4);
		Earthly_Branches.put('辰', 5);
		Earthly_Branches.put('巳', 6);
		Earthly_Branches.put('午', 7);
		Earthly_Branches.put('未', 8);
		Earthly_Branches.put('申', 9);
		Earthly_Branches.put('酉', 10);
		Earthly_Branches.put('戌', 11);
		Earthly_Branches.put('亥', 12);
	}

	public static int getCode(String name) {
		int n = name.length();
		if (n < 2)
			throw new IllegalArgumentException("Unknown name: " + name);

		char h = name.charAt(0);
		Integer hCode = Heavenly_Stems.get(h);
		if (hCode == null)
			throw new IllegalArgumentException("Unknown name: " + name);
		char e = name.charAt(1);
		Integer eCode = Earthly_Branches.get(e);
		if (eCode == null)
			throw new IllegalArgumentException("Unknown name: " + name);
		hCode%=10;
		eCode%=12;
		for (int c = 1; c <= 60; c++) {
			if (c % 10 == hCode && c % 12 == eCode)
				return c;
		}
		throw new IllegalArgumentException("Unknown name: " + name);
	}

	public static void main(String[] args) {
		System.out.println(getCode("甲子"));
		System.out.println(getCode("壬辰"));
		System.out.println(getCode("癸酉"));
		System.out.println(getCode("癸亥"));
		
	}
}




其实用查表法是最好的

2011年10月09日 09:27

相关推荐

    刚刚写的一个天干地支换算程序,用DEVC++编写的一个进行公历年和天干地支的算法

    本人小白,初学C语言,用DEVC++编写的一个进行公历年和天干地支的算法,欢迎指导

    年份天干地支计算

    输入年份,计算天干地支

    易语言取某日天干地支计算源码

    在易语言中,我们可以使用内置的日期时间函数来获取当前或指定日期的日、月、年信息,然后通过特定的算法将这些信息转换为对应的天干地支。这个过程通常包括以下步骤: 1. **获取日期**:首先,我们需要获取到一个...

    易语言取某日天干地支计算

    在这里,我们将深入探讨如何利用易语言编写代码来获取特定日期对应的天干地支,并了解相关算法和实现细节。 首先,我们需要理解天干地支的组成和排列顺序。天干包括甲、乙、丙、丁、戊、己、庚、辛、壬、癸,地支则...

    天干地支查询 VC MFC

    在这个项目中,开发人员编写了算法来根据年份计算对应的天干地支。算法的核心是理解天干地支与公元年份之间的关系。公元1年对应的天干地支是“甲子”,之后每10年天干循环一次,每12年地支循环一次。通过将年份除以...

    c# 日期类,提供农历、24节气、天干地支等

    日期类,特点包括: 1:提供1901-2049共150年的农历; 2:提供农历年月日时的干支信息; 3:提供24节气信息及计算方法。理论上计算几百几千年的节气还是没什么问题的,甚至可以精确到分/秒。 但对于普通人来说,...

    天干地支的纪年算法.doc

    天干地支的纪年算法.doc

    高中历史之历史百科天干地支纪年素材

    【天干地支纪年法】是中国古代独特的纪年方式,源自古人对自然现象的观察。天干有十个,分别为甲、乙、丙、丁、戊、己、庚、辛、壬、癸,象征着树木的生长过程。地支则有十二个,包括子、丑、寅、卯、辰、巳、午、未...

    生辰八字的天干地支的转换

    天干地支是一种纪年、纪月、纪日、纪时的方法,同时也被用在占卜、命理学等领域。在这个项目中,我们关注的是如何在编程环境中实现天干地支的转换。 天干有十个,依次是甲、乙、丙、丁、戊、己、庚、辛、壬、癸;...

    万年历插件,有天干地支,星座,节气等功能,附源码以及调用方法

    1. **天干地支**:中国传统的纪年方式,由十天干(甲、乙、丙、丁、戊、己、庚、辛、壬、癸)和十二地支(子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥)组成,每60年一个循环。插件应能计算出任何公历日期对应...

    C#农历源代码

    在C#中实现农历计算,开发者需要对农历的规则有深入理解,包括闰月处理、节气转换以及天干地支的算法。源代码可能包含以下关键部分: 1. **日期转换**:将公历日期转换为农历日期。这通常涉及到农历月份和日期的...

    易语言源码易语言取某日天干地支计算源码.rar

    理解这段源码,需要对易语言的基本语法和天干地支的算法有一定的了解。 在易语言中,进行天干地支计算通常涉及以下几个步骤: 1. **日期处理**:首先,程序需要获取用户输入或系统当前的日期。易语言提供了日期...

    阳历转农历,包含天干地支年份生肖信息 代码

    本项目主要涉及的是将阳历日期转化为农历,并同时提供天干地支、年份以及对应的生肖信息。以下是对这个代码实现的详细解释。 首先,我们要理解阳历和农历的基本概念。阳历,又称公历,是国际上普遍采用的日期系统,...

    古代纪年法天干地支十二生肖二十四节气PPT课件.pptx

    古代纪年法天干地支十二生肖二十四节气PPT课件.pptx 本PPT课件主要介绍了古代中国人的纪年法,包括天干地支、十二生肖和二十四节气的概念和计算方法。 首先,天干地支是中国古代用来纪年的方法。天干指的是天干的...

    易语言取某日天干地支计算源码.zip

    在“易语言取某日天干地支计算源码.zip”这个压缩包中,包含的是一段用易语言编写的源代码,其功能是计算特定日期对应的天干地支。在中国传统文化中,天干地支是一种纪年、纪月、纪日、纪时的方法,由十天干(甲、乙...

    火山安卓年份取天干地支.rar

    "main.v"可能是一个主程序文件,通常包含应用程序的入口点,而"必看源码.v"可能是一个关键的源代码文件,包含了实现年份到天干地支转换算法的具体代码。在Android开发中,这类功能可能会用于创建农历应用或者文化...

    php实现天干地支计算器示例

    1. 公元后的天干地支算法: 天干部分:将公元年的末尾数字与对应的天干序号匹配。例如,1894年的末尾数字是4,对应天干中的"甲"。 地支部分:将公元年除以12得到的余数作为地支的序号。如1894年除以12余数是10,...

    c.zip_天干地支 C++

    2》看你的星座的程序:3》天干地支年的计算:4》大学生一门课的成绩(人大):5》求大学生一门课成绩的算法(武大);6》判断你胖不胖;7》查找n叶梅花数,你想要什么数呢?如:三叶梅花数;8》n个数排列的计算:

    易语言取某日天干地支计算源码-易语言

    2. **算法实现**:计算天干地支涉及到一定的数学算法。首先,需要确定输入日期相对于1900年1月31日(易语言中的日期零点)的天数,然后通过模运算和除法将这个天数转换为天干和地支的索引。 3. **字符串操作**:...

Global site tag (gtag.js) - Google Analytics