1.不用加减乘除做加法
题目描述:
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
分析:
第一步:两数进行异或操作,相当于求出两个数二进制不算进位的和,记为sum,如:5^7-->101^111=010-->2
第二步:两数进行与操作并向左移一位,相当于求出两个数二进制进位的和,记为carry,如:(5&7)<<1 --> (101&111)<<1010 --> 10
第三步:将sum赋给num1,将carry赋给num2,重复一、二步操作,直到num2等于0,此时说明没有再进位了,返回num1.
代码:
public class Solution {
public int Add(int num1,int num2) {
while(num2 !=0){
int sum = num1^num2;
int carry = (num1&num2)<<1;
num1 = sum;
num2 = carry;
}
return num1;
}
}
2.求1+2+3+...+n
题目描述:
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
分析:
短路思路+递归实现,递归的思路很简单,F[n] = F[n-1]+n,而不使用上述关键字及条件判断语句,我们就要用到短路思想,设置一个boolean型的变量,boolean flag = (n>0)&&((sum += Sum_Solution(n-1))>0);当前半段判断为false时,此行代码会终止,最后直接返回sum即可。
代码:
public class Solution {
public int Sum_Solution(int n) {
int sum = n;
boolean flag = (n>0)&&((sum += Sum_Solution(n-1))>0);
return sum;
}
}