网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月19日漏签0天
单片机吧 关注:213,097贴子:1,050,761
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1回复贴,共1页
<<返回单片机吧
>0< 加载中...

计算两年之间的闰年个数

  • 只看楼主
  • 收藏

  • 回复
  • 整个名容易
  • 少校
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最近偶然翻出几年前的一段代码,当时是为了做一个电子钟写的代码,代码的主要作用是计算两年之间的闰年个数
当时的代码是这样写的:
#define RunNian(a)((a%4==0)&&(a%100))||(a%400==0)>0? 1:0
unsigned int NumberEfLeapYear1(unsigned int year1,unsigned int year2)
{
unsigned int i;
unsigned int con=0;
if((year1==0)&&(year2==0))
return 0;
if(year2<year1)
return 0;
for(i=year1;i<year2;i++)
{
if( RunNian(i) )
{
con++;
}
}
if (year1 == 0)
con--;
return con ;
}
解决的问题的方法简单粗暴,就是通过循环累加两年之间闰年,程序当时运行也没有什么问题,就一直这样用,今天在看到这段代码的时候,就一个感觉,
效率低下。
于是就想通过算法的方式解决问题,通过网络搜索,结果很不满意,于是通过苦苦思索,终于找到了计算方法
#define RunNian(a)((a%4==0)&&(a%100))||(a%400==0)>0? 1:0
unsigned int NumberEfLeapYear1(unsigned int year1,unsigned int year2)
{
unsigned int a,b;
if((year1==0)&&(year2==0))
return 0;
year2 --;//不算最后一年
if(year2<year1)
return 0; a = year1/4-year1/100+year1/400;
b = year2/4-year2/100+year2/400;
if(year1!=0)
{
if (RunNian(year1))
return b-a+1;
}
return b-a;
}
思路是这样的,计算0年至每一年的之间的闰年个数,然后相减,差就是两年之间的闰年个数,
那么代码结果正确吗?
我写了一段代码验证一下
int main (void)
{
int a,b,c,d;
int i,n;
a = 0; b = 2200;
for (n=a ; n<=b ; n++)
{
for (i=n ; i<=b ; i++)
{
c = NumberEfLeapYear(n,i);
d = NumberEfLeapYear1(n,i);
if (c != d)
{
printf ("n=%d,i=%d\n",n,i);
printf ("end!\n");
printf ("c=%d ",c);
printf ("d=%d\n",d);
break;
}
}
if(c!=d)
break;
}
if((n==b+1) && (i==b+1))
printf ("ok!\n");
return 0;
}

结果完全正确
比较一下效率
int main (void)
{
int a,b,c,d;
int i,n;
a = 0; b = 9999;
for (n=a ; n<=b ; n++)
{
for (i=n ; i<=b ; i++)
{
c = NumberEfLeapYear1(n,i);
}
}
return 0;
}
累加函数时间

跑完0~9999年耗时5.612S
改成计算函数

仅耗时0.7384S
相差很悬殊
看来算法真的很重要


  • 整个名容易
  • 少校
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
删除 |

整个名容易
大尉9
用在51单片机上看看效果
累加方式

计算方式

程序在编译后累加的方式比计算的方式程序大了107BytesROM,但是累加方式写的函数运行时占用58%的CPU,而计算的算法只占用了11%的CPU,而且还是用在51单片机上,如果用在除法指令快一些的单片机上效果还会更好,所以我觉得还是用一点空间换时间还是值得的。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1回复贴,共1页
<<返回单片机吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示