求1+2+3+...+n,Java代码实现

KLQ 2020-04-15 11:27:58 java常见问答 4900

不使用乘除法、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 < 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;
        }
};

思路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;
        }
};

想了解更多的Java实例吗?更多实例,可以继续关注本站的Java实例专栏了解哦。