求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。(牛客)
1.&&短路法
1).理解
当看到这样一道十分跳出常规的题时,我们不免会感到十分的手足无措,这道题将我们能够想到的所有方法都封印了。
但是!
去尝试分析一下题目,求解1+2+3+…n的本质是什么?
公式法?但封印了乘除…
不准用循环语句,那么去使用递归吗…?
使用递归需要判断语句去结束我们的递归。但是不准用判断语句。
好了,大致框架已经出现,我们的目标就是
1.通过递归来解除循环语句的封印。
->2.通过一个神奇的方式来结束我们的递归
这个神奇的方法是什么呢?
不得不谈到我们很早以前学到的一个C/C++特性,一个十分容易遗忘的特性
&&短路求值
当A && B中A为假时,B就不会被计算。
框架已经构成,接下来就是代码实现了。
2).代码
class X
{
public:
int Sum(int n)
{
static int sum=0;
sum+=n;
(n--)&&Sum(n);
return sum;
}
};
class Solution {
public:
int Sum_Solution(int n) {
return X().Sum(n);
}
};
通过使用static定义一个sum来达到我们的存储总和的目的。
当我们一直一直递归下去,直到n–为0时,&&夹断短路,不再递归下去然后返回sum。
2.构造函数法
1).理解
通过上面的一种方法,我们还可以继续思考,不用递归如何做到。
我们的目的是进行n次运算,那么怎样才能使函数固定运行n次呢?
对了!构造函数即可完成以上操作。
当我们构造一个类数组时,数组中成员的个数为固定的个数,那么我们通过构造n个类不就做到让一个函数运行n次了吗!
2).代码
class Sum{
public:
Sum()
{
_sum+=x;
x--;
}
static int _sum;
static int x;
};
int Sum:: _sum=0;
int Sum:: x=0;
class Solution {
public:
int Sum_Solution(int n) {
Sum::x=n;
Sum* x=new Sum[n];
delete[] x;
return Sum::_sum;
}
};
这样去做的话,我们就固定完成了n次函数的调用.
注意静态成员变量要在外面初始化,初始化时要带上类型名称。
这两种方法,可以让我们清晰的看到代码的美感。如果对你有帮助,请您留下一个赞吧 ;
@(。・o・)@ @(。・o・)@ @(。・o・)@