题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。也不得使用while、 for、 if、 else 、switch 、case等关键字及条件判断语句(A? B:C)
解题思路:
解题代码:
1.利用&& 运算符的短路性质,递归求和。
&&就是逻辑与,逻辑与有个短路特点,前面为假,后面不计算
class Solution {
public:
int Sum_Solution(int n) {
int ans=n;
ans && (ans += Sum_Solution(n-1) );
return ans;
}
};
2.
class assist{
public:
assist() {N++;sum += N;}
static void reset(){N=0;sum=0;}//在VS中不需要此调用函数也可以(不进行多加一次)
static unsigned int GetSum(){return sum;}
private:
static int N;
static int sum;
};
int assist::N = 0;
int assist::sum = 0;
//设置一个静态变量N和sum,在构造函数中进行累加运算;
//然后构造一个以辅助类为类型、大小为n的数组,重复调用此构造函数n次来实现n次的累加运算
class Solution {
public:
int Sum_Solution(int n) {
assist::reset();
assist * p = new assist[n];
delete []p;
p = nullptr;
return assist::GetSum();
}
};
//第二种方法:使用模板函数进行编程,显示定义输入参数为1的模块
template <int m> inline int SumTo() { return m + SumTo<m-1>(); } template <> inline int SumTo<1>() { return 1; }
//第三种方法:使用虚函数
class Base;
Base* Array[2];
class Base{
public:
virtual int Sum(int n){return 0;}
};
class Derived : public Base{
public:
virtual int Sum(int n){return Array[!!n]->Sum(n-1) + n;}
};
//使用虚函数来构造递归,在基类种定义虚函数Sum(n)返回0,通过将指针数组的两个元素分别绑定到基类和派生类,其中基类的Sum()
//结束递归,!!n来构造true(1) false(0)来对指针数组进行访问
class Solution {
public:
int Sum_Solution(int n) {
Base a;
Derived b;
Array[0] = &a;
Array[1] = &b;
return b.Sum(n);
}
};
//使用短路计算来构造递归:重点是输入0的时候输出0来结束递归
//缺点:递归的层数不能太深<3000
class Solution {
public:
int Sum_Solution(int n) {
int ret = n;
n && (ret += Sum_Solution(n-1));
return ret;
}
};