某面试题s=1+2-3+4-5+...+n编写一个函数,传入参数 n ,返回 s 的值

 这个求和有很多种方法,最先想到的是通过循环,判断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;
   }
  } 

这个方法,很明显,与输入数的大小几乎没有任何的性能上的问题,但前提是对数列进行分析。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值