当n很大时计算1-2+3-4+5-6+7...+n

来源:互联网 发布:梦幻西游2mac更新失败 编辑:程序博客网 时间:2024/05/16 02:06

这道题目其实并不难,但是如何写才能让程序看上去更简单,更高效呢?看一下几种算法的比较:

算法一:

long fn1(long n)
 
{
 
 long temp=0;
 
 int i,flag=1;
 
 if(n<=0)
 
 {
 
  cout<<"error:n must >0"<<endl;
 
  exit(1);
 
 }
 
 for(i=1;i<=n;i++)
 
 {
 
  temp=temp+flag*i;
 
  flag=flag*(-1);
 
 }

 return temp;
 
}

这样写其实是最容易理解的写法,但是效率却很低,尤其当数据量很大时,下面是一个改进方法:

算法二:

long fn2(long n)
 
{
 
 long temp=0;
 
 int i=1,j=1,flag=1;
 
 if(n<=0)
 
 {
 
  cout<<"error:n must >0"<<endl;
 
  exit(1);
 
 }
 
 while(j<=n)
 
 {
 
  temp+=i;
 
  i=-i;
 
  i>0? i++ :i--;
 
  j++;
 
 }
 
 return temp;

 }

这样写改进了不少,将所有涉及到乘法指令的语句改为执行加法指令,既达到要题目的要求而且运算时间上缩短了很多,而代价仅仅是增加了一个整型变量!但是这样的话效率依然很低。下面看方法三

算法三:

 long fn3(long n)
 
{
 
 if(n<=0)
 
 {
 
  cout<<"error:n must >0"<<endl;
 
  exit(1);
 
 }
 
 if(n%2==0)
 
  return(n/2)*(-1);
 
 else
 
  return(n/2)*(-1)+n;
 
}

这样写,不仅程序看起来更简单,代码量减少了不少,而且程序的运行效率得到了一个极大的提升,当然还可以进一步的优化以获得的最高效率

法四:

 long fn4(long n)
 
{
 
 if(n<=0)
 
 {
 
  cout<<"error:n must >0"<<endl;
 
  exit(1);
 
 }
 
 if(n%2==0)
 
  return(n>>1)*(-1);//当你需要乘以除以2的时候,不妨用位运算符<<>>来代替,执行效率更高
 
 else
 
  return-((n-1)>>1)+n;
 
}

在这里,用位运算符将十进制转换成二进制来运算,无疑进一步提升了效率

 

 

 

 

 


原创粉丝点击