笔者在网上搜索并查看了关于计算生辰八字的各种计算方法,然后一个人研究构思花了三天左右写下了下面计算生辰八字的C程序,然后经过多次修改和数据试验发现还是存在问题的,希望看到并仔细研究的读者能够帮我纠正。如有更好的算法请联系我!谢谢!(微信:Zhangsir1949)
//
// main.c
// 生辰八字计算程序
//
// Created by 恺铉(zkx1949) on /3/7.
// Copyright © 恺铉(zkx1949). All rights reserved.
//
#include <stdio.h>
int main(int argc, const char * argv[])
{
int sl[8];
int y,m,d,h,minute;
int a=0;
printf("请输入您的出生年月日时,输入格式例如:“1997/03/22/01:38” 「范围(1900-2099)」:");
scanf("%d/%d/%d/%d:%d",&y,&m,&d,&h,&minute);
//年干支计算
sl[0]=(y%10)-3;
if(sl[0]<=0)
sl[0]=sl[0]+10;
//年干计算********************************************************
if(y>= 2000&&y<=2099)//2000-2099年年支计算************************************
{
sl[1]=(y%100+5)%12;
}
else if(y>=1900&&y<=1999)
{
sl[1]=(y%100+1)%12;//1900-1999年年支计算**************************************
}
else
{
printf("超出范围!!! 范围(1900-2099)");
}
//月干支计算
sl[2]=(sl[0]*2+m-1)%10;//月干计算*******************************************************
sl[3]=(m+1)%12;
if(sl[3]<=0)
{sl[3]=sl[3]+12;}
//月支计算**********************************************************
//日干支计算
if(y>=2000)
{
int α=((y-2000)/4)*1461;
int β=(y-2000)%4;
int x=0;
if(y%4!=0)
{
switch (m)
{
case 1:
x=d-1;
break;
case 2:
x=31+d-1;
break;
case 3:
x=59+d-1;
break;
case 4:
x=90+d-1;
break;
case 5:
x=120+d-1;
break;
case 6:
x=151+d-1;
break;
case 7:
x=181+d-1;
break;
case 8:
x=213+d-1;
break;
case 9:
x=243+d-1;
break;
case 10:
x=273+d-1;
break;
case 11:
x=304+d-1;
break;
case 12:
x=334+d-1;
break;
default:
break;
}
}
else
{
switch (m)
{
case 1:
x=d-1;
break;
case 2:
x=31+d-1;
break;
case 3:
x=60+d-1;
break;
case 4:
x=91+d-1;
break;
case 5:
x=121+d-1;
break;
case 6:
x=152+d-1;
break;
case 7:
x=182+d-1;
break;
case 8:
x=214+d-1;
break;
case 9:
x=244+d-1;
break;
case 10:
x=274+d-1;
break;
case 11:
x=305+d-1;
break;
case 12:
x=335+d-1;
break;
default:
break;
}
}
switch (β)
{
case 0:
a=α+x;
break;
case 1:
a=366+α+x;
break;
case 2:
a=366+365+α+x;
break;
case 3:
a=366+365+365+α+x;
break;
}
sl[4]=(a-5)%10;//2000年及以后日干计算*************************************************
sl[5]=(a-5)%12;//2000年及以后日支计算*************************************************
}
else
{
int x=0;
if(y%4!=0)
{
switch (m)
{
case 1:
x=366-d;
break;
case 2:
x=335-d;
break;
case 3:
x=307-d;
break;
case 4:
x=276-d;
break;
case 5:
x=246-d;
break;
case 6:
x=215-d;
break;
case 7:
x=185-d;
break;
case 8:
x=154-d;
break;
case 9:
x=123-d;
break;
case 10:
x=93-d;
break;
case 11:
x=62-d;
break;
case 12:
x=32-d;
break;
default:
break;
}
}
else
{
switch (m)
{
case 1:
x=367-d;
break;
case 2:
x=336-d;
break;
case 3:
x=308-d;
break;
case 4:
x=277-d;
break;
case 5:
x=247-d;
break;
case 6:
x=216-d;
break;
case 7:
x=186-d;
break;
case 8:
x=155-d;
break;
case 9:
x=124-d;
break;
case 10:
x=94-d;
break;
case 11:
x=63-d;
break;
case 12:
x=33-d;
break;
default:
break;
}
}
a=x+((1999-y)/4)*1461+((1999-y)%4)*365;
sl[4]=10-((a+5)%10);//2000年以前日干计算*********************************************
sl[5]=12-((a+5)%12);//2000年以前日支计算*********************************************
}
//时干支计算
switch (h)
{
case 23:sl[7]=1;
break;
case 0:sl[7]=1;
break;
case 1:sl[7]=2;
break;
case 2:sl[7]=2;
break;
case 3:sl[7]=3;
break;
case 4:sl[7]=3;
break;
case 5:sl[7]=4;
break;
case 6:sl[7]=4;
break;
case 7:sl[7]=5;
break;
case 8:sl[7]=5;
break;
case 9:sl[7]=6;
break;
case 10:sl[7]=6;
break;
case 11:sl[7]=7;
break;
case 12:sl[7]=7;
break;
case 13:sl[7]=8;
break;
case 14:sl[7]=8;
break;
case 15:sl[7]=9;
break;
case 16:sl[7]=9;
break;
case 17:sl[7]=10;
break;
case 18:sl[7]=10;
break;
case 19:sl[7]=11;
break;
case 20:sl[7]=11;
break;
case 21:sl[7]=12;
break;
case 22:sl[7]=12;
break;
}//时支计算****************************************************************************
sl[6]=(sl[4]*2+sl[7]-2)%10;//时干计算*************************************************
int i=0;
for(i=0;i<8;i++)
{
if(i%2==0)
{
switch (sl[i])
{
case 1:
printf("甲");
break;
case 2:
printf("乙");
break;
case 3:
printf("丙");
break;
case 4:
printf("丁");
break;
case 5:
printf("戊");
break;
case 6:
printf("己");
break;
case 7:
printf("庚");
break;
case 8:
printf("辛");
break;
case 9:
printf("壬");
break;
case 0:
printf("癸");
break;
case 10:
printf("癸");
break;
default:
break;
}
}
else
{
switch (sl[i])
{
case 1:
printf("子");
break;
case 2:
printf("丑");
break;
case 3:
printf("寅");
break;
case 4:
printf("卯");
break;
case 5:
printf("辰");
break;
case 6:
printf("巳");
break;
case 7:
printf("午");
break;
case 8:
printf("未");
break;
case 9:
printf("申");
break;
case 10:
printf("酉");
break;
case 11:
printf("戌");
break;
case 0:
printf("亥");
break;
case 12:
printf("亥");
break;
default:
break;
}
}
}
printf("为您的生辰八字\n");
printf("%d/%d/%d/%d/%d/%d/%d/%d\n",sl[0],sl[1],sl[2],sl[3],sl[4],sl[5],sl[6],sl[7]);
return 0;
}
感谢您抽出宝贵时间来阅读此程序,此程序还有不足的地方和关于生辰八字错误的算法,请读者务必用您锐利的眼睛和严谨的思维帮我发觉出来,笔者在这里感激不尽!!!