1. 另类加法
题目描述:
给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。
示例:
输入:1,2
输出:3
OJ链接
解题思路:
1.异或运算相当于相加(不考虑进位 )比如: 1 ^ 2 = 3 1 + 2 = 3;
2. 与运算左移一位 是两个数相加进位后结果(只考虑进位) 1 & 2 = 0(没有1,不需要进位)
3. 总结:不需要进位,异或的结果就是相加的结果;
4. 需要进位,例如2、 3
sum = 2 ^ 3;
0010
0011 ^
----------
0001 (有1,需要进位)
carray = (2 & 3) << 1;
0010
0011 &
--------
0010 0010 << 1 : 0100
sum carray再重复上述运算
0001
0100 ^
---------
0101 =》5 就是结果
0001
0100 &
---------
0000 (不需要进位,结束)
两个数相加:对应二进制位相加的结果 + 进位的结果,当进位之后的结果为0时,相加结束
代码如下:
import java.util.*;
public class UnusualAdd {
public int addAB(int A, int B) {
if (A == 0) {
return B;
} else if (B == 0) {
return A;
}
int sum = 0;
int carray = 0;
while (B != 0) {
sum = A ^ B;
carray = (A & B) << 1;
A = sum;
B = carray;
}
return A;
}
}
2.走方格的方案数
题目描述:
请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
本题含有多组样例输入。
示例:
输入:
2 2
1 2
输出:
6
3
OJ链接
解题思路:
1、先从简单情况分析,当n=1,m=1时,就是1个格子;一共有2条路径;
2、当m>0,n=1时,例如m=3;一共有4条路径,就是m+n;
3、当n>0,m=1时,例如n=3;一共有4条路径,就是m+n;所以当m=1或者n=1时,一共有m+n条路;
4、当n>0,m>0时,例如n=3,m=3;从右边走,走到第一个格子,这个格子的路有当m=2,n=3时这么多条;
从下边走,走到第一个格子,这个格子的路有当m=3,n=2时这么多条;依次递推,当m=1或者n=1时,路径就有m+n条;
代码如下:
import java.util.*;
public class Main {
public static int med(int n, int m) {
if (n == 1 || m == 1) {
return m + n;
}
return med(n-1, m) + med(n, m-1);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
int n = sc.nextInt();
int m = sc.nextInt();
System.out.println(med(n, m));
}
}
}