不用加减乘除做加法(求两个整数之和,要求在不得使用+、-、*、/四则运算符号)、求1+2+3+...+n(不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断)

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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43109561/article/details/89555771