考察知识点:发散思维
题目描述
求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/x-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/x-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/x-tex"> (n * n + n) / 2 </annotation> </semantics> </math>(n∗n+n)/2 ,规定不能用乘除法,我们把 <math> <semantics> <mrow> <mi> n </mi> <mo> ∗ </mo> <mi> n </mi> </mrow> <annotation encoding="application/x-tex"> n * n </annotation> </semantics> </math>n∗n 换为 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;
}
};