每日一题,防止痴呆 = =
一、题目大意
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/qiu-12n-lcof
二、题目思路以及AC代码
这种题我还是第一次见,其实求得1+2+…+n有很多种方法,但是题目限制不能使用乘除法还有一些关键字,就得琢磨琢磨了。
思路一:幂运算 + 加法
这个是我最开始想到的,虽然不知道行不行。我们都知道高斯定理求解这个问题的公式是n*(n+1)/2,那么我们把上面展开,就是 n2+n,而题目中只提到了不能用乘除法,这个也算是避开了吧,虽然可能在pow函数的实现上使用了乘法。然后除以2就直接用移位运算符代替就好了。
思路二:递归
当然除了上面的不知道对不对的思路,我们还可以用逻辑运算符的短路原则去建立递归。若A&&B,且A为false,则后面就不再被运算了,同理若A||B,且A为true,后面也不会再被运算,所以我们就可以以前一部分A作为递归结束的条件,然后B作为递归的体。
思路三:俄罗斯农民乘法
这个其实我之前也不知道,原理的话可以看一下这个博客 俄罗斯农民乘法。
这个方法总之就是可以用二进制来通过加法计算乘法。这样的话,由于题目限制给定n的大小小于10000,而10000的二进制数长度是14位,虽然是需要用到循环,但我们可以把循环展开成14个顺序语句,就可以了。
但是这里我想吐槽一下,既然可以这样循环展开,那我完全可以展开10000个循环体,每个循环体就是 n >= i && res += i,不是也可以? 虽然这样是比俄罗斯农民乘法复杂 = =。
AC代码
这里就给出思路二的吧,思路一是比较简单,思路三是后来没有写 = =。
class Solution {
public:
int sumNums(int n) {
!n || (n += sumNums(n-1));
return n;
}
};
如果有问题,欢迎大家指正!!!