问题:我输入 男方的生日:1980-01-01 01:01:01 女方生日:1980-01-01 01:01:01
跪求这样一个八字合婚算法
合婚软件似乎很多,关键是怎么去写或者说算法,网络上几乎没有类似文章
作为易学高手的我(大师♂罗莊)对告诉各位码农如何制作合婚软件 负有不可推卸的责任。
算法介绍:
现在很多乡村算命先生都用 呂才合婚法和本命卦合婚法。
这个东西其实我已经说过:http://blog.sina.com.cn/s/blog_6248932801019bu3.html
这里用点代码实现下而已
60甲子:
甲子乙丑海中金,丙寅丁卯炉中火.
戊辰己巳大林木,庚午辛未路旁土.
壬申癸酉剑锋金,甲戌乙亥山头火.
丙子丁丑涧下水,戊寅己卯城头土.
庚辰辛巳白腊金,壬午癸未杨柳木.
甲申乙酉泉中水,丙戌丁亥屋上土.
戊子己丑霹雳火,庚寅辛卯松柏木.
壬辰癸巳长流水,甲午乙未砂中金.
丙申丁酉山下火,戊戌己亥平地木.
庚子辛丑璧上土,壬寅癸卯金簿金.
甲辰乙巳覆灯火,丙午丁未天河水.
戊申己酉大驿土,庚戌辛亥钗钏金.
壬子癸丑桑柘木,甲寅乙卯大溪水.
丙辰丁巳沙中土,戊午己未天上火.
庚申辛酉石榴木,壬戌癸亥大海水.
干支对宫挂:
干支 | 纳音 | 岁 数 | 男 | 女 |
| 干支 | 纳音 | 岁 数 | 男 | 女 |
| 干支 | 纳音 | 岁 数 | 男 | 女 |
丙戌 | 屋上土 | 1 | 3 | 3 | 丙寅 | 炉中火 | 21 | 5 | 1 | 丙午 | 天河水 | 41 | 7 | 8 | ||
乙酉 | 泉中水 | 2 | 4 | 2 | 乙丑 | 海中金 | 22 | 6 | 9 | 乙巳 | 佛灯火 | 42 | 8 | 7 | ||
甲申 | 泉中水 | 3 | 5 | 1 | 甲子 | 海中金 | 23 | 7 | 8 | 甲辰 | 佛灯火 | 43 | 9 | 6 | ||
癸未 | 杨柳木 | 4 | 6 | 9 | 癸亥 | 大海水 | 24 | 8 | 7 | 癸卯 | 金箔金 | 44 | 1 | 5 | ||
壬午 | 杨柳木 | 5 | 7 | 8 | 壬戌 | 大海水 | 25 | 9 | 6 | 壬寅 | 金箔金 | 45 | 2 | 4 | ||
辛巳 | 白蜡金 | 6 | 8 | 7 | 辛酉 | 石榴木 | 26 | 1 | 5 | 辛丑 | 壁上土 | 46 | 3 | 3 | ||
庚辰 | 白蜡金 | 7 | 9 | 6 | 庚申 | 石榴木 | 27 | 2 | 4 | 庚子 | 壁上土 | 47 | 4 | 2 | ||
己卯 | 城墙土 | 8 | 1 | 5 | 己未 | 天上火 | 28 | 3 | 3 | 己亥 | 平地木 | 48 | 5 | 1 | ||
戊寅 | 城墙土 | 9 | 2 | 4 | 戊午 | 天上火 | 29 | 4 | 2 | 戊戌 | 平地木 | 49 | 6 | 9 | ||
丁丑 | 涧下水 | 10 | 3 | 3 | 丁巳 | 沙中土 | 30 | 5 | 1 | 丁酉 | 山下火 | 50 | 7 | 8 | ||
丙子 | 涧下水 | 11 | 4 | 2 | 丙辰 | 沙中土 | 31 | 6 | 9 | 丙申 | 山下火 | 51 | 8 | 7 | ||
乙亥 | 山头火 | 12 | 5 | 1 | 乙卯 | 大溪水 | 32 | 7 | 8 | 乙未 | 沙中金 | 52 | 9 | 6 | ||
甲戌 | 山头火 | 13 | 6 | 9 | 甲寅 | 大溪水 | 33 | 8 | 7 | 甲午 | 沙中金 | 53 | 1 | 5 | ||
癸酉 | 剑锋金 | 14 | 7 | 8 | 癸丑 | 桑松木 | 34 | 9 | 6 | 癸巳 | 长流水 | 54 | 2 | 4 | ||
壬申 | 剑锋金 | 15 | 8 | 7 | 壬子 | 桑松木 | 35 | 1 | 5 | 壬辰 | 长流水 | 55 | 3 | 3 | ||
辛未 | 路旁土 | 16 | 9 | 6 | 辛亥 | 钗钏金 | 36 | 2 | 4 | 辛卯 | 松柏木 | 56 | 4 | 2 | ||
庚午 | 路旁土 | 17 | 1 | 5 | 庚戌 | 钗钏金 | 37 | 3 | 3 | 庚寅 | 松柏木 | 57 | 5 | 1 | ||
己巳 | 大林木 | 18 | 2 | 4 | 己酉 | 大驿土 | 38 | 4 | 2 | 己丑 | 霹雳火 | 58 | 6 | 9 | ||
戊辰 | 大林木 | 19 | 3 | 3 | 戊申 | 大驿土 | 39 | 5 | 1 | 戊子 | 霹雳火 | 59 | 7 | 8 | ||
丁卯 | 炉中火 | 20 | 4 | 2 | 丁未 | 天河水 | 40 | 6 | 9 | 丁亥 | 屋上土 | 60 | 8 | 7 |
结果表:
(对方)
(自己) ① ② ③ ④ ⑥ ⑦ ⑧ ⑨
① 伏位 绝命 天医 生气 六煞 祸害 五鬼 延年
② 绝命 伏位 祸害 五鬼 延年 天医 生气 六煞
③ 天医 祸害 伏位 延年 五鬼 绝命 六煞 生气
④ 生气 五鬼 延年 伏位 祸害 六煞 绝命 天医
⑥ 六煞 延年 五鬼 祸害 伏位 生气 天医 绝命
⑦ 祸害 天医 绝命 六煞 生气 伏位 延年 五鬼
⑧ 五鬼 生气 六煞 绝命 天医 延年 伏位 祸害
⑨ 延年 六煞 生气 天医 绝命 五鬼 祸害 伏位
思路:其实就是查几个表而已,60甲子一个表查年柱,根据结果查上面干支对宫挂表,最后根据结果查结果表。
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package luozhuanghehun;
/**
* 吕才合婚算法
*
* @author luozhuang 大师♂罗莊
*/
public class luozhuanglvhehun {
enum sex {
man,
woman;
}
public final String[] jiazhi = {
"甲子", "乙丑", "丙寅", "丁卯", "戊辰", "己巳", "庚午", "辛未", "壬申", "癸酉",
"甲戌", "乙亥", "丙子", "丁丑", "戊寅", "己卯", "庚辰", "辛巳", "壬午", "癸未",
"甲申", "乙酉", "丙戌", "丁亥", "戊子", "己丑", "庚寅", "辛卯", "壬辰", "癸巳",
"甲午", "乙未", "丙申", "丁酉", "戊戌", "己亥", "庚子", "辛丑", "壬寅", "癸卯",
"甲辰", "乙巳", "丙午", "丁未", "戊申", "己酉", "庚戌", "辛亥", "壬子", "癸丑",
"甲寅", "乙卯", "丙辰", "丁巳", "戊午", "己未", "庚申", "辛酉", "壬戌", "癸亥"
};
//注意数组没有第5行和第5列
public final String[][] resultarray = {
{"伏位", "绝命", "天医", "生气", "六煞", "祸害", "五鬼", "延年"},
{"绝命", "伏位", "祸害", "五鬼", "延年", "天医", "生气", "六煞"},
{"天医", "祸害", "伏位", "延年", "五鬼", "绝命", "六煞", "生气"},
{"生气", "五鬼", "延年", "伏位", "祸害", "六煞", "绝命", "天医"},
{"六煞", "延年", "五鬼", "祸害", "伏位", "生气", "天医", "绝命"},
{"祸害", "天医", "绝命", "六煞", "生气", "伏位", "延年", "五鬼"},
{"五鬼", "生气", "六煞", "绝命", "天医", "延年", "伏位", "祸害"},
{"延年", "六煞", "生气", "天医", "绝命", "五鬼", "祸害", "伏位"},};
public final String[][] numsix = {
//干支,纳音,岁数,男,女
{"丙戌", "屋上土", "1", "3", "3"},
{"乙酉", "泉中水", "2", "4", "2"},
{"甲申", "泉中水", "3", "5", "1"},
{"癸未", "杨柳木", "4", "6", "9"},
{"壬午", "杨柳木", "5", "7", "8"},
{"辛巳", "白蜡金", "6", "8", "7"},
{"庚辰", "白蜡金", "7", "9", "6"},
{"己卯", "城墙土", "8", "1", "5"},
{"戊寅", "城墙土", "9", "2", "4"},
{"丁丑", "涧下水", "10", "3", "3"},
{"丙子", "涧下水", "11", "4", "2"},
{"乙亥", "山头火", "12", "5", "1"},
{"甲戌", "山头火", "13", "6", "9"},
{"癸酉", "剑锋金", "14", "7", "8"},
{"壬申", "剑锋金", "15", "8", "7"},
{"辛未", "路旁土", "16", "9", "6"},
{"庚午", "路旁土", "17", "1", "5"},
{"己巳", "大林木", "18", "2", "4"},
{"戊辰", "大林木", "19", "3", "3"},
{"丁卯", "炉中火", "20", "4", "2"},
{"丙寅", "炉中火", "21", "5", "1"},
{"乙丑", "海中金", "22", "6", "9"},
{"甲子", "海中金", "23", "7", "8"},
{"癸亥", "大海水", "24", "8", "7"},
{"壬戌", "大海水", "25", "9", "6"},
{"辛酉", "石榴木", "26", "1", "5"},
{"庚申", "石榴木", "27", "2", "4"},
{"己未", "天上火", "28", "3", "3"},
{"戊午", "天上火", "29", "4", "2"},
{"丁巳", "沙中土", "30", "5", "1"},
{"丙辰", "沙中土", "31", "6", "9"},
{"乙卯", "大溪水", "32", "7", "8"},
{"甲寅", "大溪水", "33", "8", "7"},
{"癸丑", "桑松木", "34", "9", "6"},
{"壬子", "桑松木", "35", "1", "5"},
{"辛亥", "钗钏金", "36", "2", "4"},
{"庚戌", "钗钏金", "37", "3", "3"},
{"己酉", "大驿土", "38", "4", "2"},
{"戊申", "大驿土", "39", "5", "1"},
{"丁未", "天河水", "40", "6", "9"},
{"丙午", "天河水", "41", "7", "8"},
{"乙巳", "佛灯火", "42", "8", "7"},
{"甲辰", "佛灯火", "43", "9", "6"},
{"癸卯", "金箔金", "44", "1", "5"},
{"壬寅", "金箔金", "45", "2", "4"},
{"辛丑", "壁上土", "46", "3", "3"},
{"庚子", "壁上土", "47", "4", "2"},
{"己亥", "平地木", "48", "5", "1"},
{"戊戌", "平地木", "49", "6", "9"},
{"丁酉", "山下火", "50", "7", "8"},
{"丙申", "山下火", "51", "8", "7"},
{"乙未", "沙中金", "52", "9", "6"},
{"甲午", "沙中金", "53", "1", "5"},
{"癸巳", "长流水", "54", "2", "4"},
{"壬辰", "长流水", "55", "3", "3"},
{"辛卯", "松柏木", "56", "4", "2"},
{"庚寅", "松柏木", "57", "5", "1"},
{"己丑", "霹雳火", "58", "6", "9"},
{"戊子", "霹雳火", "59", "7", "8"},
{"丁亥", "屋上土", "60", "8", "7"},};
/**
*
* @param man 男方年份字符串
* @param woman 女方年份字符串
* @return
*/
public String hehun(String man, String woman) {
if (man.length() != 4 || woman.length() != 4) {
return "输入不正确";
}
return peihun(man, woman);
}
public String peihun(String manyear, String womanyear) {
return peihun(getnumber(manyear), getnumber(womanyear));
}
private String peihun(int manyear, int womanyear) {
String mang = getnumsix(yearnumber(manyear), sex.man);
String womang = getnumsix(yearnumber(womanyear), sex.woman);
int man = getnumber(mang);
int woman = getnumber(womang);
//数组从0开始,而我们计算从1开始
man--;
woman--;
//注意数组没有第5行和第5列
if (man >= 5) {
man--;
}
if (woman >= 5) {
woman--;
}
//根据表格取结果
return resultarray[man][woman];//顺序一样的
}
/**
*
* @param year 年份
* @param isman 男的么
* @return 返回宫挂数
*/
public String getnumsix(String year, sex isman) {
for (int i = 0; i < 60; i++) {
if (year.equalsIgnoreCase(numsix[i][0])) {
if (isman == sex.man) {
return numsix[i][3];
} else {
return numsix[i][4];
}
}
}
return null;
}
/**
* 字符串-》数字
*
* @param year 字符串
* @return 字符串对应数字
* @throws NumberFormatException
*/
public int getnumber(String year) throws NumberFormatException {
int yearnumber = Short.parseShort(year);
return yearnumber;
}
/**
* 年份取出年柱
*
* @param year 年数
* @return 求的年份的干支
*/
public String yearnumber(int year) {
//1864年是甲子年,每隔六十年一个甲子
int idx = (Math.abs(year - 1864)) % 60;
//没有过春节的话那么年还算上一年的,此处求的年份的干支
String result = jiazhi[idx];
return result;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
luozhuanglvhehun my = new luozhuanglvhehun();
String result = my.hehun("1947", "1853");
System.out.println(result);
}
}