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

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

}

};

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值