这个求和有很多种方法,最先想到的是通过循环,判断1-n之间的数是偶数还是奇数,然后添加运算符号求和如下:
int total4(int n)
{
int sum = 0;
if(n <= 1)
{
return sum += n;
}
for(int i=2;i<=n;i++)
{
if(i%2 == 0)
{
sum += i;
}
else
{
sum += -i;
}
}
return sum+1;
}
或者
int total3(int n)
{
if(n<1)
{
return -1;
}
int sum = 1;
bool add = true;
for(int iLoop=2; iLoop<=n; iLoop++, add=!add)
{
sum += add ? iLoop : -1 * iLoop;
}
return sum;
}
以上两种方法都用到了for循环,虽说能实现目的,但从性能上来说,遇到复杂的数据还是会有明显的效率问题;
以下是不采用循环来实现,
/// <summary>
/// s=1+2-3+4-5+.....+n
/// 分解数列,
/// 当n为偶数时,则s可分为s=1+(2+4+6+...+n)-(3+5+7+...+(n-1)); 令s1=2+4+6+8+...+n;s2=3+5+7+9+...+n-1;s2=s1-2-(n/2-1);s=1+s1-(s1-2-n/2+1)=n/2+2;
/// 当n为奇数时,则s可分为s=1+(2+4+6+...+(n-1))-(3+5+7+...+n);令s1=2+4+6+...+n-1;s2=3+5+7+...+n;s2=s1+n/2-1;s=1+s1-(s1+(n-1)/2) = (3-n)/2;
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
int totalBest(int n)
{
if(n%2 == 0)
{
return n/2+2;
}
else
{
return (3-n)/2;
}
}
这个方法,很明显,与输入数的大小几乎没有任何的性能上的问题,但前提是对数列进行分析。