计算节气-查表法

单片机存储有限,需要进行精简

如果把每一年的 节气的日期值依次排序得到一个hashcode

如:

某一年,小寒是01月06日 大寒是01月20日 立春是......

则hashcode为

010601200204021903060321040504200506052106060622070707230808082309080923100910241108112312071222

根据几百年的数据分析,hashcode是很少的几个,仅仅50个,一个char类型就可以放某年的24节气数据

于是代码如下(以下代码虽然很长,但可以通过最下面的代码生成这段代码

(已遍历1970-2100的每一天,对比验证以下计算代码正确)

//1970年至2100年的 节气类型表
static int[] JIEQI_TABLE = {
	0,1,2,3,0,4,5,6,7,8,5,
	6,9,10,11,12,13,14,15,16,17,0,15,18,19,0,15,20,19,0,15,20,19,0,15,20,6,0,21,22,6,
	7,23,24,6,9,25,26,12,17,27,28,16,17,29,28,20,19,29,28,20,19,29,28,20,6,29,28,20,6,29,
	30,22,6,31,32,24,6,33,34,26,16,35,34,26,36,35,37,28,36,38,37,28,20,38,37,28,20,39,37,30,
	20,39,40,30,24,39,40,41,24,39,42,43,26,44,45,34,26,46,45,37,28,46,47,37,28,48,49,37,28,20,
};
//小寒->冬至 对应 1->24 | 无节气返回0
public static int GetJieqi(int y, int m, int d)
{
	int code = JIEQI_TABLE[y - YEAR_START];
	int md = m * 100 + d;

	switch (m)
	{
		case 1:
			switch (code)
			{
				case 0:
				case 1:
				case 2:
				case 4:
				case 5:
				case 7:
				case 8:
				case 9:
				case 10:
				case 11:
				case 14:
				case 15:
				case 21:
				case 23:
				case 25:
				case 27:
				case 29:
				case 31:
				case 33:
					if (md == 106) return 1;
					break;
				case 3:
				case 6:
				case 12:
				case 13:
				case 16:
				case 17:
				case 18:
				case 19:
				case 20:
				case 22:
				case 24:
				case 26:
				case 28:
				case 30:
				case 32:
				case 34:
				case 35:
				case 36:
				case 37:
				case 38:
				case 39:
				case 40:
				case 41:
				case 42:
				case 43:
				case 44:
				case 46:
				case 48:
					if (md == 105) return 1;
					break;
				case 45:
				case 47:
				case 49:
					if (md == 104) return 1;
					break;
			}
			switch (code)
			{
				case 0:
				case 3:
				case 6:
				case 7:
				case 8:
				case 9:
				case 10:
				case 12:
				case 13:
				case 14:
				case 16:
				case 17:
				case 18:
				case 19:
				case 20:
				case 22:
				case 24:
				case 25:
				case 26:
				case 27:
				case 28:
				case 29:
				case 30:
				case 31:
				case 32:
				case 33:
				case 35:
				case 36:
				case 38:
				case 39:
				case 41:
				case 43:
				case 44:
				case 46:
				case 48:
					if (md == 120) return 2;
					break;
				case 1:
				case 2:
				case 4:
				case 5:
				case 11:
				case 15:
				case 21:
				case 23:
					if (md == 121) return 2;
					break;
				case 34:
				case 37:
				case 40:
				case 42:
				case 45:
				case 47:
				case 49:
					if (md == 119) return 2;
					break;
			}
			break;
		case 2:
			switch (code)
			{
				case 0:
				case 1:
				case 3:
				case 4:
				case 6:
				case 7:
				case 8:
				case 9:
				case 10:
				case 11:
				case 12:
				case 13:
				case 14:
				case 15:
				case 16:
				case 17:
				case 18:
				case 19:
				case 20:
				case 21:
				case 22:
				case 23:
				case 24:
				case 25:
				case 27:
				case 29:
				case 31:
				case 33:
				case 35:
				case 36:
				case 38:
				case 39:
				case 44:
				case 46:
				case 48:
					if (md == 204) return 3;
					break;
				case 2:
				case 5:
					if (md == 205) return 3;
					break;
				case 26:
				case 28:
				case 30:
				case 32:
				case 34:
				case 37:
				case 40:
				case 41:
				case 42:
				case 43:
				case 45:
				case 47:
				case 49:
					if (md == 203) return 3;
					break;
			}
			switch (code)
			{
				case 0:
				case 1:
				case 2:
				case 3:
				case 4:
				case 5:
				case 6:
				case 7:
				case 8:
				case 9:
				case 10:
				case 11:
				case 12:
				case 13:
				case 14:
				case 15:
				case 16:
				case 17:
				case 19:
				case 21:
				case 23:
				case 25:
				case 27:
				case 29:
				case 31:
				case 33:
				case 35:
				case 36:
				case 38:
				case 39:
				case 44:
				case 46:
					if (md == 219) return 4;
					break;
				case 18:
				case 20:
				case 22:
				case 24:
				case 26:
				case 28:
				case 30:
				case 32:
				case 34:
				case 37:
				case 40:
				case 41:
				case 42:
				case 43:
				case 45:
				case 47:
				case 48:
				case 49:
					if (md == 218) return 4;
					break;
			}
			break;
		case 3:
			switch (code)
			{
				case 0:
				case 1:
				case 3:
				case 4:
				case 6:
				case 7:
				case 8:
				case 9:
				case 10:
				case 13:
				case 14:
				case 17:
				case 19:
					if (md == 306) return 5;
					break;
				case 2:
				case 5:
				case 11:
				case 12:
				case 15:
				case 16:
				case 18:
				case 20:
				case 21:
				case 22:
				case 23:
				case 2
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值