本文主要是介绍算八字和阴阳五行(Java基础),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
一、引言
二、问题描述
三、问题分析
四、算法分析
1.年柱
2.月柱
3.日柱
4.时柱
五、完整代码展示
六、结果验证
七、结语
一、引言
每年回家过年,亲戚们都会问我“小韩学的什么专业呀,给七大姑八大姨展示一下呀”等等一系列类似的问题。今年在机缘巧合之下,我接触到了算卦,并且通过某音某站学习到了一下关于算卦的一些基础算法,比如说算八字,算五行等等,然后我就有了一个神奇的想法,要是将算卦和Java结合起来会是什么样的呢,今天呢,我就给大家讲解一下如何用Java算八字和五行。
话说回来,那什么是八字什么是五行呢?
八字 即生辰八字,是一个人出生时的干支历日期。八字在汉族民俗信仰中占有重要地位 ,年干和年支组成年柱,月干和月支组成月柱,日干和日支组成日柱,时干和时支组成时柱;一共四柱,四个干和四个支共八个字,故又称四柱八字。四柱加大运加流年的预测模式称之为子平术;四柱太阳律月亮律属于四柱完整的预测技术与方法。
五行,也叫五行学说,是认识世界的基本方式, 五行的意义包含借着阴阳演变过程的五种基本动态:金(代表敛聚)、木(代表曲直)、水(代表浸润)、火(代表炎热)、土(代表生化)。中国哲学家用五行理论来说明世界万物的形成及其相互关系。
二、问题描述
- 如何算八字
- 如何算五行
三、问题分析
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基础)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!