【每日一题】LeetCode. 面试题64. 求1+2+...+n

每日一题,防止痴呆 = =

一、题目大意

求 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;
    }
};

如果有问题,欢迎大家指正!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值