这道题要求不能用数运算符,既然不能用加减乘除,然后又要对数字进行操作,那考虑的方向只能是什么位运算符啊什么位移运算符啊什么的
针对这道题给出解决办法:两个数相加,如果两个数 按位与 后 向左移 移动一位 的值,如果等于0,那么!!! 这两个数 按位异或 的结果就是这两个数的和!!!!
就针对上述的思想来举个例子
这个例子就符合了上述的解决办法
但是!!! 万一两个数的按位与后左移1,结果不为0呢? 那就想办法让它变成0
思路:假如两个数左移后不等于0,这时搞一个sum=A^B;搞一个tmp = (A^B)<<1; 因为tmp不等于0,那么让A=sum,B=tmp,然后继续循环,此时A是一个新数,B也是一个新数,继续看AB的tmp是不是等于0,如果tmp等于0了,那么此时的sum就是原来AB的和
import java.util.*;
public class UnusualAdd {
public int addAB(int A, int B) {
// write code here
if(B == 0){
return A;
}else if(A == 0){
return B;
}
int sum = 0;
int tmp = 0;
while(B != 0){
sum = A ^ B;
tmp = (A & B) << 1;
A = sum;
B = tmp;
}
return sum;
}
}
这道题画个图来理解题目想表达的意思
这几幅图就能明白题目想表达的意思和当m=1或者n=1时候的结果
那么n,m>1呢?
根据图解,这道题就得用递归来写,递归的结束条件就是要么m=1时返回m+n,要么n=1时返回m+n
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
System.out.println(func(n,m));
}
public static int func(int n, int m){
if(n == 1 || m == 1){
return m+n;
}
return func(n-1,m) + func(n,m-1);
}
}
递归的过程就是横竖遇到一个岔路口就要减一的往下走,一直到走到递归的结束条件,就不停的返回总数