一、另类加法
1. 题目描述
给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。
2. 测试样例
输入
1,2
输出
3
3. 题目分析
-
如果 B 的值为 0,直接返回 A 作为结果,因为任何数加上 0 的结果都是它本身。
-
如果 B 的值不为 0,进入 while 循环。
-
在循环中,首先用异或运算符 ^ 计算 A 和 B 的异或值,即不带进位的和,将其赋给变量 sum。
-
接着用与运算符 & 计算 A 和 B 的与值,并将其左移一位,得到进位的值,将其赋给变量 carry。
-
将 sum 赋值给 A,表示更新 A 的值为不带进位的和。
-
将 carry 赋值给 B,表示更新 B 的值为进位的值。
-
继续循环,直到 B 的值为 0。
-
最后返回 A,即为 A 和 B 的和。
4. 代码
public class UnusualAdd {
public int addAB(int A, int B) {
if(B==0){
return A;
}
int sum=0;
int carry=0;
while (B!=0){
sum=A^B;
carry=(A&B)<<1;
A=sum;
B=carry;
}
return A;
}
}
二、求路径总数
1. 题目描述
请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
数据范围: 1≤n,m≤8
2. 输入描述
输入两个正整数n和m,用空格隔开。(1≤n,m≤8)
3. 输出描述
输出一行结果
4. 示例
输入:
2 2
输出:
6
5. 题目分析
- m == 1&& n > 0|| n==1&&m>0,返回m+n;
- 否则返回med(n-1,m)+med(n,m-1);
6. 代码
import java.util.Scanner;
public class number_Paths {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int m=sc.nextInt();
System.out.println(med(n,m));
}
}
private static int med(int n, int m) {
if(m==1&&n>0||n==1&&m>0){
return m+n;
}
return med(n-1,m)+med(n,m-1);
}
}