高手帮我看看,详细说明看图
来源:学生作业帮 编辑:搜狗做题网作业帮 分类:综合作业 时间:2024/08/18 15:14:13
高手帮我看看,详细说明看图
//下面面数据存放了1900年到1909 十年的农历 大小月情况
求 农历1900年x月x日 距公历1900年1月1日的的天数
const unsigned int nongli[10] = {0xDB4A,0x2D4A,0x0A95,0x992B,0x792E,0x0A6D,0x955A,0x65AA,0x0D65,0x9D4A};
int get(int n ,int y,int r,int s=0)//n是年,r是日,s=1表示y是个闰月,默认不是.
{
\x05int nc=n-1900;//年差
\x05int sum=0;
\x05y=y+2;//因为生活中的农历是从正月初一开始,上面数据表从上年的冬月1日开始.
\x05if(y>12)//例如要查农历3月,那么应该是第5个月 第4位.
\x05{
\x05\x05y=y-12;
\x05\x05nc=nc+1;
\x05}
\x05int rn=(nongli[ nc ]>>15) & 0x01 ;//查看是否含有闰月.
\x05if(s&&!rn)//如果设置闰月,而不存在闰月
\x05{\x05
\x05\x05return -1;
\x05}
\x05int nxh;
\x05int yxh;
\x05int rno;
\x05for( nxh=0;nxh<nc;nxh++)//年循环
\x05{
\x05\x05 rno =(nongli[ nxh ]>>15) & 0x01 ;//挨个检测是否含有闰月,有闰月就取值到12位.
\x05\x05for(int yxh=0;yxh<( rno 13 :12); yxh++)
\x05\x05{
\x05\x05\x05sum=sum+(29+((nongli[nxh]>>yxh)&0x01));//29+1是大月,29+0是小月
\x05\x05}
\x05}
\x05int ry=0;
\x05if(!rn)//不存在闰月
\x05{
\x05\x05for( yxh=0;yxh<y;yxh++)
\x05\x05{
\x05\x05\x05sum=sum+(29+((nongli[nxh]>>yxh)&0x01));
\x05\x05}
\x05\x05//if( r> (29+((nongli[nxh]>>yxh)&0x01)) )//如果该月只有29天,却求30天返回错误.
\x05\x05//{
\x05\x05//\x05return -1;
\x05\x05//}
\x05}
\x05else//如果存在闰月
\x05{
\x05\x05ry= ( (nongli[ nc ] & 0x4000 ) >> 11 ) + ( nongli[ nc + 1 ] >> 12 );//查出闰那个月
\x05\x05if(s)
\x05\x05{
\x05\x05\x05if(y==ry)
\x05\x05\x05{
\x05\x05\x05\x05for(yxh=0;yxh<(y+1);yxh++)//
\x05\x05\x05\x05{
\x05\x05\x05\x05\x05sum=sum+(29+((nongli[nxh]>>yxh)&0x01));//求整月的天数
\x05\x05\x05\x05}
\x05\x05\x05\x05
\x05\x05\x05}else
\x05\x05\x05{
\x05\x05\x05\x05return -1;
\x05\x05\x05}
\x05\x05\x05
\x05\x05}
\x05\x05else//没设置闰月
\x05\x05{
\x05\x05\x05if(y<(ry+1))//小于闰月
\x05\x05\x05{
\x05\x05\x05\x05for(yxh=0;yxh<y;yxh++)
\x05\x05\x05\x05{
\x05\x05\x05\x05\x05sum=sum+(29+((nongli[nxh]>>yxh)&0x01));
\x05\x05\x05\x05}
\x05\x05\x05}
\x05\x05\x05else if(y>ry)//大于闰月
\x05\x05\x05{
\x05\x05\x05\x05y=y+1;//延后一月.
\x05\x05\x05\x05for(yxh=0;yxh<y;yxh++)
\x05\x05\x05\x05{
\x05\x05\x05\x05\x05sum=sum+(29+((nongli[nxh]>>yxh)&0x01));
\x05\x05\x05\x05}
\x05\x05\x05\x05
\x05\x05\x05}
\x05\x05}
\x05\x05
\x05}
\x05\x05
\x05return sum+r-59;//-59调整 与1900年1月1日的时间差
}
1903年6月25 农历 闰5月1 返回1270
1903年7月24 农历6月1 返回 1300.实际1299,多了一天
1903年8月23 农历7月1 返回1329没问题
为什么闰月后的一个月就会多了一天,其他都正常.谁能帮我看看
![](http://img.wesiedu.com/upload/b/95/b95f2e5c4e9fc6ca03f998198c935e69.jpg)
//下面面数据存放了1900年到1909 十年的农历 大小月情况
求 农历1900年x月x日 距公历1900年1月1日的的天数
const unsigned int nongli[10] = {0xDB4A,0x2D4A,0x0A95,0x992B,0x792E,0x0A6D,0x955A,0x65AA,0x0D65,0x9D4A};
int get(int n ,int y,int r,int s=0)//n是年,r是日,s=1表示y是个闰月,默认不是.
{
\x05int nc=n-1900;//年差
\x05int sum=0;
\x05y=y+2;//因为生活中的农历是从正月初一开始,上面数据表从上年的冬月1日开始.
\x05if(y>12)//例如要查农历3月,那么应该是第5个月 第4位.
\x05{
\x05\x05y=y-12;
\x05\x05nc=nc+1;
\x05}
\x05int rn=(nongli[ nc ]>>15) & 0x01 ;//查看是否含有闰月.
\x05if(s&&!rn)//如果设置闰月,而不存在闰月
\x05{\x05
\x05\x05return -1;
\x05}
\x05int nxh;
\x05int yxh;
\x05int rno;
\x05for( nxh=0;nxh<nc;nxh++)//年循环
\x05{
\x05\x05 rno =(nongli[ nxh ]>>15) & 0x01 ;//挨个检测是否含有闰月,有闰月就取值到12位.
\x05\x05for(int yxh=0;yxh<( rno 13 :12); yxh++)
\x05\x05{
\x05\x05\x05sum=sum+(29+((nongli[nxh]>>yxh)&0x01));//29+1是大月,29+0是小月
\x05\x05}
\x05}
\x05int ry=0;
\x05if(!rn)//不存在闰月
\x05{
\x05\x05for( yxh=0;yxh<y;yxh++)
\x05\x05{
\x05\x05\x05sum=sum+(29+((nongli[nxh]>>yxh)&0x01));
\x05\x05}
\x05\x05//if( r> (29+((nongli[nxh]>>yxh)&0x01)) )//如果该月只有29天,却求30天返回错误.
\x05\x05//{
\x05\x05//\x05return -1;
\x05\x05//}
\x05}
\x05else//如果存在闰月
\x05{
\x05\x05ry= ( (nongli[ nc ] & 0x4000 ) >> 11 ) + ( nongli[ nc + 1 ] >> 12 );//查出闰那个月
\x05\x05if(s)
\x05\x05{
\x05\x05\x05if(y==ry)
\x05\x05\x05{
\x05\x05\x05\x05for(yxh=0;yxh<(y+1);yxh++)//
\x05\x05\x05\x05{
\x05\x05\x05\x05\x05sum=sum+(29+((nongli[nxh]>>yxh)&0x01));//求整月的天数
\x05\x05\x05\x05}
\x05\x05\x05\x05
\x05\x05\x05}else
\x05\x05\x05{
\x05\x05\x05\x05return -1;
\x05\x05\x05}
\x05\x05\x05
\x05\x05}
\x05\x05else//没设置闰月
\x05\x05{
\x05\x05\x05if(y<(ry+1))//小于闰月
\x05\x05\x05{
\x05\x05\x05\x05for(yxh=0;yxh<y;yxh++)
\x05\x05\x05\x05{
\x05\x05\x05\x05\x05sum=sum+(29+((nongli[nxh]>>yxh)&0x01));
\x05\x05\x05\x05}
\x05\x05\x05}
\x05\x05\x05else if(y>ry)//大于闰月
\x05\x05\x05{
\x05\x05\x05\x05y=y+1;//延后一月.
\x05\x05\x05\x05for(yxh=0;yxh<y;yxh++)
\x05\x05\x05\x05{
\x05\x05\x05\x05\x05sum=sum+(29+((nongli[nxh]>>yxh)&0x01));
\x05\x05\x05\x05}
\x05\x05\x05\x05
\x05\x05\x05}
\x05\x05}
\x05\x05
\x05}
\x05\x05
\x05return sum+r-59;//-59调整 与1900年1月1日的时间差
}
1903年6月25 农历 闰5月1 返回1270
1903年7月24 农历6月1 返回 1300.实际1299,多了一天
1903年8月23 农历7月1 返回1329没问题
为什么闰月后的一个月就会多了一天,其他都正常.谁能帮我看看
![](http://img.wesiedu.com/upload/b/95/b95f2e5c4e9fc6ca03f998198c935e69.jpg)
![高手帮我看看,详细说明看图](/uploads/image/z/19419245-53-5.jpg?t=%E9%AB%98%E6%89%8B%E5%B8%AE%E6%88%91%E7%9C%8B%E7%9C%8B%2C%E8%AF%A6%E7%BB%86%E8%AF%B4%E6%98%8E%E7%9C%8B%E5%9B%BE)
不知道楼主那个-59调整是怎么算出来的,准确与否,
后面取整月的程序,应该把y值全部剪去1吧,只能算前面几个月的,最后一个月不算整月,所以只能加上零头r.
所以最终的-59我觉得有问题.如楼主所附答案,当输入1900.8.29.1时候,楼主所计算的当年的总共计算了当年的11个月,5X30+6X29+29-59=294,当输入1900.9.1时候,计算了12个月,6X30+6X29+1-59=296,刚好差两天,因为多计算了一个月,楼主算润8月的时候已经把整个润8月算进去了,润八月为小月,多算了29天,而算9月的时候,已经把整个九月算进去了,九月为大月,多算30天,两相比较,就出现了楼主的情况了.若y全部剪去1,则最终答案为润八月29:5X30+5X29+29-59=324-59九月1 : 5X30+6X29+1-59=325-59刚好只差一天
后面取整月的程序,应该把y值全部剪去1吧,只能算前面几个月的,最后一个月不算整月,所以只能加上零头r.
![](http://img.wesiedu.com/upload/f/10/f10aac222e12a93b56d8972250600b45.jpg)