求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:
1 <= n <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/qiu-12n-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
如果题目没有任何的限制的话,那么就会有3中方式:
方式一:
利用乘除法进行求解,但是明确要求不可以使用乘除法,所以排除。
public int sumNums(int n){
return n * (n + 1) / 2; //利用数学公式进行求解
}
方式二:
既然不可以使用乘除法,那么就只能使用加法,要使用加法,就需要利用循环或者递归。但是循环或者递归,必然需要使用到if来进行判断,但是题目已经明确要求不可以使用if语句,所以排除。
public int sumNums(int n){
if(n == 1)
return 1;
return n + sumNums(n - 1);
}
正确的解法
既然不可以使用if来判断,那么利用递归的时候,如何让程序结束递归呢?
其实我们可以利用与运算,当n大于1的时候,那么就进入递归,返回值是一个boolean类型的值。
对应的代码:
class Solution {
int res = 0;
public int sumNums(int n) {
/*
模拟if语句,进行判断n是否大于1,如果大于1,就进入递归,而这个x并没有
任何的作用,但由于是一个模拟的是一个if语句,那么对应的值是一个boolean
类型的值,否则,如果x定义是其它类型的,就需要使用A > B ? A : B,三目运
算符,但是题目也已经明确要求不可以使用这个运算符,所以最好的方式就是将
x定义为boolean类型.
*/
boolean x = n > 1 && sumNums(n - 1) > 0;
res += n;
return res;
}
}
运行结果:
LeetCode 不用加减乘除进行加法
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof
不用加减乘除法进行加法,那么我们可以利用逻辑运算符进行运算了。
学习过数字逻辑电路这门课中就有说到半加器之类的,半加器就是运用到的就是逻辑运算符。两个数相加,那么本位和就是两个数字进行异或,产生的进位就是两者进行与运算。
请看下面的例子及过程分析:
对应的代码:
class Solution {
public int add(int a, int b) {
while(b != 0){
int c = (a & b) << 1;//当前数字相加之后产生的进位,由于需要进行下一次的相加,所以还需要左移一位
a ^= b;//非进位和
b = c;
}
return a;
}
}
运行结果: