面试题64. 求1+2+…+n
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:
1 <= n <= 10000
解题
用递归代替for循环;
用&&代替if条件,当n==0时,直接返回n,不进行后续递归;
class Solution {
public:
int sumNums(int n) {
n&&(n+=sumNums(n-1));
return n;
}
};
解法2:俄罗斯农民乘法
n的和,为n(n+1)/2;
用俄罗斯农民乘法代替乘法,用位运算代替除法;
俄罗斯农民乘法
a每次*2;
b每次/2;
若b为奇数则res+=a;
若b为偶数则res不变;
直到b为0停止;
class Solution {
public:
int sumNums(int n) {
int res=0;
int a=n;
int b=(n+1);
while(b){
if(b&1) //为奇数,则加
res+=n;
n<<=1;
b>>=1;
}
return res>>1;
}
};
变形
无法使用条件判断b是否为零,故列举每一位计算;
class Solution {
public:
int sumNums(int n) {
int res=0;
int a=n;
int b=(n+1);
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
(b&1)&&(res+=a);a<<=1;b>>=1;
return res>>1;
}
};