剑指offer47:位运算+递归。求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
1 题目描述
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
2 思路和方法
(1)递归,不能使用if等条件判断语句,可以使用&&逻辑运算符的短路特性实现。当n=0时,不进行后一个判断的计算,作为递归终止。
(2)利用sizeof(a)计算bool数组的字节数,bool类型在C++中占一个字节。bool a = [n][n+1]; 因一共有n*(n+1)个1,下三角或者上三角,第一行:[1]和为1;第二行:[1][1] 和为2;第三行:[1][1][1]和为3,……。bool类型的数据a,sizeof(a)=n*(n+1),所以1+2+3+...+n=sizeof(a)=n*(n+1)/2,或者是sizeof(a)>>1。
3 C++核心代码
1 #include<iostream> 2 3 #include<vector> 4 5 using namespace std; 6 7 class Solution { 8 public: 9 int Sum_Solution(int n) { 10 int sum = n; 11 sum && (sum += Sum_Solution(n - 1));// 利用前一个判断短路;当n=0时,不进行后一个判断的计算,作为递归终止 12 return sum; 13 } 14 }; 15 16 int main() 17 { 18 Solution a; 19 20 int res = a.Sum_Solution(5); 21 cout << "result = " << res << endl; 22 system("pause"); 23 return 0; 24 }
1 class Solution { 2 public: 3 int Sum_Solution(int n) { 4 bool a[n][n+1]; 5 return sizeof(a)>>1; 6 } 7 };
参考资料
https://blog.****.net/feng_zhiyu/article/details/82112248