考察知识点:发散思维

题目描述

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

题解

解法一:改进公式法

分析

想到的最简单办法就是公式法,即 总和 sum = (1 + n) * n / 2,但是题目规定不能用乘除法,那么我们取巧一下,建立一个布尔类型(因为每个单位为 1)的二维数组 <math> <semantics> <mrow> <mi> s </mi> <mo> [ </mo> <mi> n </mi> <mo> ] </mo> <mo> [ </mo> <mi> n </mi> <mo> + </mo> <mn> 1 </mn> <mo> ] </mo> </mrow> <annotation encoding="application&#47;x&#45;tex"> s[n][n+1] </annotation> </semantics> </math>s[n][n+1],用 sizeof(s) 得到 (1+n) * n,再用左移符号 >> ,左移一位代表 / 2,得到答案

代码
class Solution {
public:
    int Sum_Solution(int n) {
        bool s[n][n+1];
        return sizeof(s)>>1;
    }
};

解法二:还是改进公式法

分析

我们还是根据公式法改编,sum = <math> <semantics> <mrow> <mo> ( </mo> <mn> 1 </mn> <mo> + </mo> <mi> n </mi> <mo> ) </mo> <mo> ∗ </mo> <mi> n </mi> <mi mathvariant="normal"> / </mi> <mn> 2 </mn> </mrow> <annotation encoding="application&#47;x&#45;tex"> (1 + n) * n / 2 </annotation> </semantics> </math>(1+n)n/2 = <math> <semantics> <mrow> <mo> ( </mo> <mi> n </mi> <mo> ∗ </mo> <mi> n </mi> <mo> + </mo> <mi> n </mi> <mo> ) </mo> <mi mathvariant="normal"> / </mi> <mn> 2 </mn> </mrow> <annotation encoding="application&#47;x&#45;tex"> (n * n + n) / 2 </annotation> </semantics> </math>(nn+n)/2 ,规定不能用乘除法,我们把 <math> <semantics> <mrow> <mi> n </mi> <mo> ∗ </mo> <mi> n </mi> </mrow> <annotation encoding="application&#47;x&#45;tex"> n * n </annotation> </semantics> </math>nn 换为 pow(2,n),/ 2 用左移 >>1 表示

代码
class Solution {
public:
    int Sum_Solution(int n) {
        bool s[n][n+1];
        return sizeof(s)>>1;
    }
};

解法三:利用 &&

分析

也容易想到递归,但是递归得有结束条件,规定不能用 if,我们可以用 &&,俗称短路与,当 && 符号前的表达式为 false 时,不判断后面表达式,正好前面可以用来放结束条件,即 n,后面可以用来累加,当 n 减为 0 时,结束递归

代码
class Solution {
public:
    int Sum_Solution(int n) {
        int sum = n;
        sum && (sum += Sum_Solution(n-1));
        return sum;
    }
};