不用乘除,循环,判断求前n项和 (三种方法)

题目:求 1+2+ … +n
要求不能使用乘除法、 for while if else switch case 等关键字以及条件判断语句
A?B:C

方法1:针对循环可以用递归来替代,而针对递归的结束可以用n&&(fun())来代替,因为一旦n等于0则不会执行后面的代码了。

整个代码:

int addtion(int n)

{

           int t=0;

           n&&(t= addtion( n-1));

           return n+ t;

}

 

方法二:利用数学知识其实当在处理数组之类问题,利用数学知识去考虑,也是一种思路。

#define T(X, Y, i) (Y &(1<<i)) && (X+=(Y<<i))
int foo(int n){
int r=n;

T(r, n, 0); T(r, n,1); T(r, n, 2); …T(r, n, 31);
return r >> 1;
}

//这个方法思路是将n看做是2位进制数,然后从低位到高位循环,如果当前位为1(假设当前位是第i)则将n的左移i位的值进行累加。也就是利用了位操作和位操作来实现求一个数的平方。

例如:

求100的平方:

100对应的二进制为:01100100

那么从右边开始向左移位(位置从0开始计数),分别发现第2,5,6位是1那么就将100左移2,5,6之后的数累加起来,实际上是100分别乘以:2^2=4,2^5=32,2^6=64,的结果进行累加,而这个累加实质就是100*(4+32+64)=100*100也就是100的平方。但它的确没有用到乘法,实在是妙不可言呀。

而我们要的结果是n^2+n,那么可以在累加前将存储累加中间结果的变量初始化为n(比如在上面代码中r初始为n),这样再进行累加就可以得到n^2+n了。

 

方法三是在网上看到的,定义一个类,我们new一含有n个这种类型元素的数组,那么该类的构造函数将确定会被调用n次。将需要执行的代码放到构造函数里。如下代码正是基于这个思路:

class Temp

{

public:

      Temp() { ++N; Sum += N; }

 

      staticvoidReset() { N = 0; Sum = 0; }

      staticintGetSum() { return Sum; }

private:

      staticint N;

      staticintSum;

};

int Temp::N = 0;

int Temp::Sum = 0;

int solution1_Sum(int n)

{

     Temp::Reset();

      Temp *a = newTemp[n];

      delete []a;

      a = 0;

      returnTemp::GetSum();

}

但个人觉得从算法角度讲第一,二种方法更好些。呵呵 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值