不使用乘除法、switch、while、else、for、if、case等关键字以及条件判断语句(A?B:C)求1+2+3+...+n的Java代码实现和思路分享。
思路1
代码实现:
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 inline int SumTo()
{
return m + SumTo ();
}
template inline int SumTo ()
{
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;
}
};
思路2:
一、需利用逻辑和的短路特性实现递归终止。
二、在n==0的时候,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回0;
三、在n>0的时候,执行sum+=Sum_Solution(n-1),实现递归计算Sum_Solution(n)。
代码实现:
public int Sum_Solution(int n)
{
int sum = n;
boolean ans = (n > 0) && ((sum += Sum_Solution(n - 1)) > 0);
return sum;
}
思路3:
先看我们手里有什么牌,就可以一步一步的想到利用短路特性了
我们手里目前能够使用(按优先级高低)单目运算符:++和--,双目运算符:+,-,移位运算符<>,关系运算符>,
单目和双目的作用是相同的,移位显然没有规律性,因为一个二进制位并不能区分某个数和其他数,这也就排除了&,|,^,因为不需要做位运算了
关系运算符要和if匹配,可是,这是不行的,这个时候看看剩下的运算符只能选&&,||了
假如是做过Java笔试题,会对这两个运算符非常敏感,他们有短路特性,前面的条件判真(或者假)了,就不会再执行后面的条件了
这个时候就可以联想到--n,直到等于0就能返回值。
代码实现:
public class Solution
{
public int Sum_Solution(int n)
{
int sum = n;
boolean flag = (sum > 0) && ((sum += Sum_Solution(--n)) > 0);
return sum;
}
}
思路4:
用公式是不可以的,公式里有乘法,实现乘法可以用sizeof***数组,两行代码就可以了。
代码实现:class Solution
{
public:
int Sum_Solution(int n)
{
bool a[n][n + 1];
return sizeof(a) >> 1;
}
};