题目:求 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();
}
但个人觉得从算法角度讲第一,二种方法更好些。呵呵
本文介绍三种不使用传统循环和条件判断语句的方法来求1到n的和,包括递归技巧、位运算及构造函数调用,巧妙地规避了限制条件。
310

被折叠的 条评论
为什么被折叠?



