目录
另类加法
题目介绍
题目分析
1.想要解决这道题首先要了解到三种位运算:^ , & , <<
2.将1和2的二进制编码按位异或(^)运算,可以到3的二进制编码,此时1和2的二进制编码按位与(&)运算再左移一位结果为0.
3.可以得出结论若两个数字的二进制编码进行按位与和左移一位操作过后结果为0,则此时两个数字按位异或后的结果为两个数字相加的结果。
如果两个数字的二进制编码进行按位与和左移一位操作过后结果不为0,则将其中一个数字值赋为两个数字的二进制编码进行按位与和左移一位操作过后的值,另外一个数字的值赋为两个数字按位异或后的值,重复以上的操作。
代码
//1另类加法
public static int addAB(int A, int B) {
int carry = (A & B) << 1;
int sum = A ^ B;
while (carry != 0) {
A = sum;
B = carry;
carry = (A & B) << 1;
sum = A ^ B;
}
return sum;
}
public static void main1(String[] args) {
System.out.println(addAB(2,3));
}
走方格的方案数字
题目介绍
题目分析
1.设方格的长和宽分别为M和N,通过分析可以知道当M或者N至少有一个长度为1时,求左上角的点到右下角的路径数目为M+N。
2.当M和N的长度都不为1的时候,可以将长度进一步分解到为1的情况。
所以,可以采用递归的方法,递归的终止条件为M或N出现长度为1。利用子问题思路,将左上角点的右边点和下边点作为两个子问题分析,将结果相加。
代码
import java.util.*;
public class Main{
public static int findNum(int N,int M) {
//递归终止条件为长或宽出现长度为1的情况
if ((N == 1 && M >= 1) || (M == 1 && N >= 1)) {
return M + N;
}
//利用子问题思路
int right = findNum(N,M - 1);
int down = findNum(N - 1,M);
return right + down;
}
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(findNum(N, M));
}
}
}