算八字和阴阳五行(Java基础)

2024-03-16 23:40

本文主要是介绍算八字和阴阳五行(Java基础),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、引言

二、问题描述

三、问题分析

四、算法分析

1.年柱

2.月柱

3.日柱

4.时柱

五、完整代码展示

六、结果验证

七、结语


一、引言

        每年回家过年,亲戚们都会问我“小韩学的什么专业呀,给七大姑八大姨展示一下呀”等等一系列类似的问题。今年在机缘巧合之下,我接触到了算卦,并且通过某音某站学习到了一下关于算卦的一些基础算法,比如说算八字,算五行等等,然后我就有了一个神奇的想法,要是将算卦和Java结合起来会是什么样的呢,今天呢,我就给大家讲解一下如何用Java算八字和五行。

        话说回来,那什么是八字什么是五行呢?

        八字 即生辰八字,是一个人出生时的干支历日期。八字在汉族民俗信仰中占有重要地位 ,年干和年支组成年柱,月干和月支组成月柱,日干和日支组成日柱,时干和时支组成时柱;一共四柱,四个干和四个支共八个字,故又称四柱八字。四柱加大运加流年的预测模式称之为子平术;四柱太阳律月亮律属于四柱完整的预测技术与方法。

        五行,也叫五行学说,是认识世界的基本方式, 五行的意义包含借着阴阳演变过程的五种基本动态:金(代表敛聚)、木(代表曲直)、水(代表浸润)、火(代表炎热)、土(代表生化)。中国哲学家用五行理论来说明世界万物的形成及其相互关系。

二、问题描述

  1. 如何算八字
  2. 如何算五行

三、问题分析

     1.如何算八字

        要想算八字,你得先知道你公历和农历的出生年月日时,然后算出年柱、月柱、日柱和时柱;

        年柱、月柱、日柱、时柱怎么算,请听算法分析;

     2.如何算五行

        算出来八字之后,算五行就显的很就简单了。算五行就是通过算出来的八字,将金、木、水、火、土 一 一对应上去就可以了。

五行:

天干地支现在被简称为“干支”,共分为十天干,十二地支。

天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸,共十个。

五行对应:甲木、乙木、丙火、丁火、戊土、己土、庚金、辛金、壬水、癸水。

地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥,共12个。

五行对应:子水、丑土、寅木、卯木、辰土、巳火、午火、未土、申金、酉金、戌土、亥水。

五行:水、火、金、木、土,为五行。

阴阳:
甲、丙、戊、庚、壬属阳;
乙、丁、己、辛、癸属阴。
子、寅、辰、午、申、戍属阳;
丑、卯、巳、未、酉、亥属阴。

四、算法分析

        对于这个算法,我认为最核心的部分就是算年柱、月柱、日柱和时柱的算法;

        算八字首先得知道十天干和十二地支

十天干
十二地支

         在Java代码中,我将十天干和十二地支分别存储在了俩个不同的数组中;

//将“十天干”存储在dry数组中
String[] dry = new String[]{"癸","甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬"};
//将“十二地支”存储在branch数组中
String[] branch = new String[]{"亥","子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌"};

1.年柱

算得的结果对应数组的索引

 //求年柱//year_dry为年干,year_branch 为年支
int year_dry = (year - 3) % 10;
int year_branch = (year - 3) % 12;

2.月柱

算月柱的天干这里有个口诀:

甲己之年丙作首,乙庚之年戊为头
丙辛之岁寻庚土,丁壬壬寅顺水流
若问戊葵何处起,甲寅之上好追求

 //month_dry为月干,month_branch为月支;int month_dry,month_branch;if (year_dry==1||year_dry==6){month_dry=2+month;}else if (year_dry==2||year_dry==7){month_dry=4+month;}else if (year_dry==3||year_dry==8){month_dry=6+month;}else if (year_dry==4||year_dry==9){month_dry=8+month;}else{month_dry=0+month;}month_branch=2+month;while (month_dry>9){month_dry=month_dry-10;}while (month_branch>11){month_branch=month_branch-12;}

3.日柱

        日柱的时间界限为每天的两个23时,例如,某某年4月9日出生,那么日柱的开始时间为4月8日23时开始,9日的23时结束。

1.以甲子为1、1

天干数:癸(0) 甲1 乙2 丙3 丁4 戊5 己6 庚7 辛8 壬9

地支数:亥(0) 子1 丑2 寅3 卯4 辰5 巳6 午7 未8 申9 酉10 戌11

2.计算公式

{ (公元年数-1)×5+(公元年数-1)÷4+当年日数} ÷60

将所得余数÷10,得出的余数作为天干序数

将所得余数÷12,得出的余数作为地支序数

        注意:算当年日数使用的是公历的年月日,需要考虑当年是否闰年,如果是闰年则二月份为29天。凡年份能被4整除的为闰年,不能被4整除的为平年。

举例:

例如:2008年3月1日的干支:

{ (2008-1)×5+(2008-1)÷4+61 }÷60

(1月31天,2月29天,3月1天共计61天)

=(10035+501(取整)+61)÷60

=176……37

求天干:37÷10=3……7(庚)

求地支:37÷12=3……1(子)

所以,2008年3月1日的干支为庚子

int day_post,day_dry,day_branch,day_numb = 0,days;for (int i=1;i<nmonth;i++){if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){day_numb += 31;}else if(i==4||i==6||i==9||i==11){day_numb += 30;}else if(i==2){//判断是否是闰年if(nyear%4==0&&nyear%100!=0||nyear%400==0){day_numb += 29;}else{day_numb += 28;}}else {System.out.println("月份输入错误!!!");}}//day_numb+nday计算的是当年年数//将计算结果储存在day_post中day_post=((nyear-1)*5+(nyear-1)/4+day_numb+nday)%60;if (day_post>10){//计算日干day_dry=day_post%10;//计算日支day_branch=day_post%12;}else {day_dry=day_post;day_branch=day_post;}

4.时柱

日上起时口诀

甲已还加甲,乙庚丙作初
丙辛生戊子,丁壬庚子居
戊葵何方发,壬子不须移

        按照此口诀,将"日上起时"的查阅方法与钟点所在的时辰合起来就组成了时干。其查阅办法是:每逢甲日己日为日干出生的人,如果出生在23点后和凌晨1点前即为子时所生,时干支为甲子时。另有口诀和掌诀图可帮助增进记忆:甲己还加甲,乙庚丙作首,丙辛从戊起,相壬庚子居,戊癸何方发,壬子是真途。 如欲知己丑日推卯时的干支,根据"甲己还加甲",可知己日从"甲日己日"上的"子时"起甲子。推的时候将左手大拇指点在子位上,读"甲子",顺点至丑位,读"乙丑",至寅位读"丙寅",至丁位读"丁卯"。丁卯即是已丑日的时干支。 手掌上推时干支的口诀在记忆时可按:甲乙丙丁戊己庚辛壬癸的时干顺序记用。其时辰子时的顺序为"甲子"、"丙子"、"庚子"、"戊子"、"壬子",即天干中的陽干为序的,其余时辰可以子时为准顺推而知。

子时:23点到01点 丑时:01点到03点

寅时:03点到05点 卯时:05点到07点

辰时:07点到09点 巳时:09点到11点

午时:11点到13点 未时:13点到15点

申时:15点到17点 酉时:17点到19点

戌时:19点到21点 亥时:21点到23点

 //求时柱/*甲已还加甲,乙庚丙作初* 丙辛生戊子,丁壬庚子居* 戊葵何方发,壬子不须移*/int hour_dry,hour_branch,hour_numb=0;if (hour>=23||hour<1){hour_numb=1;}else if (hour>=1&&hour<3){hour_numb=2;}else if (hour>=3&&hour<5){hour_numb=3;}else if (hour>=5&&hour<7){hour_numb=4;}else if (hour>=7&&hour<9){hour_numb=5;}else if (hour>=9&&hour<11){hour_numb=6;}else if (hour>=11&&hour<13){hour_numb=7;}else if (hour>=13&&hour<15){hour_numb=8;}else if (hour>=15&&hour<17){hour_numb=9;}else if (hour>=17&&hour<19){hour_numb=10;}else if (hour>=19&&hour<21){hour_numb=11;}else if (hour>=21&&hour<23){hour_numb=12;}else {System.out.println("小时输入错误!!!");}if(day_dry==1||day_dry==6){hour_dry=0+hour_numb;}else if(day_dry==2||day_dry==7){hour_dry=2+hour_numb;}else if(day_dry==3||day_dry==8){hour_dry=4+hour_numb;}else if(day_dry==4||day_dry==9){hour_dry=6+hour_numb;}else {hour_dry=8+hour_numb;}hour_branch=hour_numb;while (hour_dry>9){hour_dry-=10;}while (hour_branch>11){hour_branch-=12;}

五、完整代码展示

import java.util.Scanner;public class Main {public static void main(String[] args) {/*八字计算系统* 四注:年柱、月柱、日柱、时柱* 需要知道出生的年月日时,农历日期和阳历日期都要有*///将“十天干”存储在dry数组中String[] dry = new String[]{"癸","甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬"};//将“十天干五行”存储在drywx数组中String[] drywx = new String[]{"水","木","木","火","火","土","土","金","金","水"};//将“十天干五行阴阳”存储在drywx_yy数组中String[] drywx_yy = new String[]{"阴","阳","阴","阳","阴","阳","阴","阳","阴","阳"};//将“十二地支”存储在branch数组中String[] branch = new String[]{"亥","子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌"};//将“十二地支五行”存储在branchwx数组中String[] branchwx = new String[]{"水","水","土","木","木","土","火","火","土","金","金","土"};//将“十二地支五行阴阳”存储在branchwx_yy数组中String[] branchwx_yy = new String[]{"阴","阳","阴","阳","阴","阳","阴","阳","阴","阳","阴","阳"};//控制输入语句Scanner sc = new Scanner(System.in);int year,month,day,hour,nyear,nmonth,nday,nhour,gender,yesorno=0;do {System.out.println("请输入您的农历出生年、月、日、时(用空格分开):");//将输入的数赋值在year里year = sc.nextInt();//将输入的数赋值在month里month = sc.nextInt();//将输入的数赋值在day里day = sc.nextInt();//将输入的数赋值在hour里hour = sc.nextInt();System.out.println("请输入您的公历出生年、月、日(用空格分开):");//将输入的数赋值在nyear里nyear = sc.nextInt();//将输入的数赋值在nmonth里nmonth = sc.nextInt();//将输入的数赋值在nday里nday = sc.nextInt();System.out.println("请输入您性别:(1、男 2、女)");gender = sc.nextInt();if (year >= 2024 || year <= 1900 || month >= 13 || month <= 0 || day >= 32 || day <= 0 || hour >= 25 || hour < 0 ||gender!=1||gender!=2){System.out.println("输入错误,请重新输入!!!");yesorno=1;}if (nyear >= 2024 || nyear <= 1900 || nmonth >= 13 || nmonth <= 0 || nday >= 32 || nday <= 0){System.out.println("输入错误,请重新输入!!!");yesorno=1;}} while (yesorno==1);//求年柱int year_dry = (year - 3) % 10;int year_branch = (year - 3) % 12;//求月柱/*甲己之年丙作首,乙庚之年戊为头* 丙辛之岁寻庚土,丁壬壬寅顺水流* 若问戊葵何处起,甲寅之上好追求*///month_dry为月干,month_branch为月支;int month_dry,month_branch;if (year_dry==1||year_dry==6){month_dry=2+month;}else if (year_dry==2||year_dry==7){month_dry=4+month;}else if (year_dry==3||year_dry==8){month_dry=6+month;}else if (year_dry==4||year_dry==9){month_dry=8+month;}else{month_dry=0+month;}month_branch=2+month;while (month_dry>9){month_dry=month_dry-10;}while (month_branch>11){month_branch=month_branch-12;}//日柱int day_post,day_dry,day_branch,day_numb = 0,days;for (int i=1;i<nmonth;i++){if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){day_numb += 31;}else if(i==4||i==6||i==9||i==11){day_numb += 30;}else if(i==2){//判断是否是闰年if(nyear%4==0&&nyear%100!=0||nyear%400==0){day_numb += 29;}else{day_numb += 28;}}else {System.out.println("月份输入错误!!!");}}//day_numb+nday计算的是当年年数//将计算结果储存在day_post中day_post=((nyear-1)*5+(nyear-1)/4+day_numb+nday)%60;if (day_post>10){//计算日干day_dry=day_post%10;//计算日支day_branch=day_post%12;}else {day_dry=day_post;day_branch=day_post;}//求时柱/*甲已还加甲,乙庚丙作初* 丙辛生戊子,丁壬庚子居* 戊葵何方发,壬子不须移*/int hour_dry,hour_branch,hour_numb=0;if (hour>=23||hour<1){hour_numb=1;}else if (hour>=1&&hour<3){hour_numb=2;}else if (hour>=3&&hour<5){hour_numb=3;}else if (hour>=5&&hour<7){hour_numb=4;}else if (hour>=7&&hour<9){hour_numb=5;}else if (hour>=9&&hour<11){hour_numb=6;}else if (hour>=11&&hour<13){hour_numb=7;}else if (hour>=13&&hour<15){hour_numb=8;}else if (hour>=15&&hour<17){hour_numb=9;}else if (hour>=17&&hour<19){hour_numb=10;}else if (hour>=19&&hour<21){hour_numb=11;}else if (hour>=21&&hour<23){hour_numb=12;}else {System.out.println("小时输入错误!!!");}if(day_dry==1||day_dry==6){hour_dry=0+hour_numb;}else if(day_dry==2||day_dry==7){hour_dry=2+hour_numb;}else if(day_dry==3||day_dry==8){hour_dry=4+hour_numb;}else if(day_dry==4||day_dry==9){hour_dry=6+hour_numb;}else {hour_dry=8+hour_numb;}hour_branch=hour_numb;while (hour_dry>9){hour_dry-=10;}while (hour_branch>11){hour_branch-=12;}System.out.println("                        八字表                      ");System.out.println("---------------------------------------------------");System.out.println("|    年柱    |    月柱     |    日柱    |     时柱   |");System.out.println("---------------------------------------------------");System.out.println("| 年干 | 年支 | 月干 | 月支 | 日干 | 日支 | 时干 | 时支 |");System.out.println("---------------------------------------------------");System.out.println("|  "+dry[year_dry]+"  | "+branch[year_branch]+"  |  "+dry[month_dry]+"  |  "+branch[month_branch]+"  |  "+dry[day_dry]+"  | "+branch[day_branch]+"  |  "+dry[hour_dry]+"  |  "+branch[hour_branch]+" |");System.out.println("---------------------------------------------------");System.out.println("|    "+dry[year_dry]+""+branch[year_branch]+"    |    "+dry[month_dry]+""+branch[month_branch]+"    |    "+dry[day_dry]+""+branch[day_branch]+"     |    "+dry[hour_dry]+""+branch[hour_branch]+"    |");System.out.println("---------------------------------------------------");System.out.println("");System.out.println("                               五行表                           ");System.out.println("----------------------------------------------------------------");System.out.println("|    四柱    |    年柱    |    月柱     |    日柱    |     时柱   |");System.out.println("----------------------------------------------------------------");System.out.println("|    八字    |    "+dry[year_dry]+""+branch[year_branch]+"    |    "+dry[month_dry]+""+branch[month_branch]+"     |    "+dry[day_dry]+""+branch[day_branch]+"    |    "+dry[hour_dry]+""+branch[hour_branch]+"    |");System.out.println("----------------------------------------------------------------");System.out.println("|    天干    |     "+drywx[year_dry]+"     |     "+drywx[month_dry]+"     |     "+drywx[day_dry]+"     |     "+drywx[hour_dry]+"     |");System.out.println("----------------------------------------------------------------");System.out.println("|    地支    |     "+branchwx[year_branch]+"     |     "+branchwx[month_branch]+"     |     "+branchwx[day_branch]+"     |     "+branchwx[hour_branch]+"     |");System.out.println("----------------------------------------------------------------");System.out.println("您为:"+drywx_yy[day_dry]+drywx[day_dry]+"命");}
}

六、结果验证

我们以农历的1997年8月13日9时为例子,计算其八字和五行;

预取结果:

实际结果:

结果完全正确! 

七、结语

  • 要想彻底看懂此程序的算法运行,需要先去熟悉一下八字算法和五行。
  • 对于八字算命,我们应该持有一种科学、客观、理性的态度,既不过于迷信,也不一概否定。在做出决策时,我们可以将其作为一种参考,但同时也要结合其他因素进行综合考虑,以做出更明智的决策。
  • 感谢大家阅读我的博客,对于Java的学习有什么好的建议和问题可以留在评论区大家一起讨论。

这篇关于算八字和阴阳五行(Java基础)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817120

相关文章

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.