剑指offer - 47 -- 求1+2+3+...+n - C++

题目描述

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

题解

方法一:求和公式

求和公式

sum=\frac{(1+n)*n}{2}
这种方法不行,因为需要用到乘法
代码如下:

class Solution {
public:
    int Sum_Solution(int n) {
        return n*(n+1) / 2;
    }
};

时间复杂度:O(1)
空间复杂度:O(1)

方法二:循环求和

从1到n以步长为1,循环一下,但是此方法也不行,需要用到循环。

class Solution {
public:
    int Sum_Solution(int n) {
        int sum = n;
        for (int i=1; i<n; ++i)
            sum += i;
        return sum;
    }
};

时间复杂度:O(N)
空间复杂度:O(1)

方法三:递归

递归函数f(n)表示求1-n的和。
递推公式:f(n) = f(n-1) + n
递归终止条件:f(1) = 1
此方法也不行,递归终止条件需要用到if关键字

class Solution {
public:
    int Sum_Solution(int n) {
        if (n == 1) return n;
        return n + Sum_Solution(n-1);
    }
};

时间复杂度:O(N)
空间复杂度:O(N),需要开辟大约N个局部变量

方法四:递归变形

如果我们把方法三种的if换成别的,就可以了。
if (n==1) return 1;
也就是说如果n==1,需要终止递归,所以我们想到了逻辑与&&连接符。
A&&B,表示如果A成立则执行B,否则如果A不成立,不用执行B
因此我们可以这样。在n>1的时候,执行递归函数。

class Solution {
public:
    int Sum_Solution(int n) {
        bool x = n > 1 && (n += Sum_Solution(n-1)); // bool x只是为了不报错
        return n;
    }
};

方法五:

思路:这是一个等差数列,sum=(a1+an)n/2=>(1+n)n/2=>(n+n^2)/2;Math.pow(a,b)表示a^b;右移一位相当于除以2。

但其实求平方的操作本质还是用了乘法

class Solution {
public:
    int Sum_Solution(int n) {
        int sum = n + (int)math.pow(n,2);
        return sum >> 1;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值