本文永久链接:http://www.limou.net/?p=330

有这么一道题目:请编写一个函数,计算1-2+3-4+5-6+7……+n的值,这个n很大。

猛的一看,这个题目非常简单,没有什么好想的,于是很多人都会写下类似于如下的代码

long fn(long n)
{
long temp=0;
int i,flag=1;
if(n<=0)
{
printf(“error: n must > 0″);
return(0);
}
for(i=1;i<=n;i++)
{
temp=temp+flag*i;
flag=(-1)*flag;
}
return temp;
}

但是仔细想想,当n非常大时,这便会消耗很大的cpu,在一些嵌入式开发中,这无疑很影响程序的应用,于是可以做一些代码优化改写成如下代码:

long fn(long n)
{
long temp=0;
int j=1,i=1,flag=1;
if(n<=0)
{
printf(“error: n must > 0″);
exit(1);
}
while(j<=n)
{
temp=temp+i;
i=-i;
i>0?i++:i–;
j++;
}
return temp;
}

这段代码省去了第一段代码中的乘法指令,而换成了加法指令,大大减少了运行时间。而仅仅增加了一个变量。但是,还能不能再优化呢?

再看如下代码吧:

long fn(long n)
{
if(n<=0)
{
printf(“error: n must > 0″);
exit(1);
}
if(0 == n%2)
return (n/2)*(-1);
else
return (n/2)*(-1)+n;
}

当n的数值很大很大时,这三段代码运行所耗费的时间差距很大,从上面的三个例子中,你能想到的是什么?

请大家继续关注 李木空间 www.limou.net