码迷,mamicode.com
首页 > 其他好文 > 详细

简单问题藏着大陷阱

时间:2016-04-12 07:53:15      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:优化算法

写一个函数计算当参数为n(n很大)时的值1-2+3-4+5-6+7....+n.

你可能会马上写出如下代码:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 long fn(long n)
  4 {
  5     long temp=0;
  6     int i,flag=1;
  7     if(n<=0)
  8     {
  9         printf("input error\n");
 10         exit(1);
 11     }
 12     for(i=1;i<=n;++i)
 13     {
 14         temp+=(flag*i);
 15         flag=-1*flag;
 16     }
 17     return temp;
 18 }

但....

执行结果肯定没问题,但是当n很大时这个程序效率很低,尤其在嵌入式系统开发中,程序的运行效率很重要。

然后你可能改进了代码

 19 long fn1(long n)
 20 {
 21     long temp=0;
 22     int i=1,j=1,flag=1;
 23     if(n<=0)
 24     {
 25         printf("input error\n");
 26         exit(1);
 27     }
 28     while(j<=n)
 29     {
 30         tmpe+=i;
 31         i=-i;
 32         i>0?i++:i--;
 33         j++;
 34     }
 35     return temp;
 36 }

比起上一个程序,将所有涉及到乘法指令的语句改为执行加法语句,在运算时间上缩短了很多,而代价只是增加了一个整型变量。

仍然不够优化欧!

37 long fn2(long n)
 38 {
 39     if(n<=0)
 40     {
 41         printf("input error\n");
 42         exit(1);
 43     }
 44     if(0==n%2)
 45         return (n/2)*(-1);
 46     else
 47         return (n/2)*(-1)+n;
 48 
 49 }

有没有很惊讶!!

不要认为CPU运算速度快就把所有问题推给它做,我们应该将代码优化再优化。

不要忘了最后的测试工作!!

 50 int main()
 51 {
 52     printf("ret: %d %d %d\n",fn(100),fn1(100),fn2(100));
 53     return 0;
 54 }


本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1762707

简单问题藏着大陷阱

标签:优化算法

原文地址:http://10541556.blog.51cto.com/10531556/1762707

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!