算八字和阴阳五行(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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]