求二个二进制的和: 给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
/*
* 注意:a 和 b 仅由字符 '0' 或 '1' 组成
*
* 示例 1:
* 输入:a = "11", b = "1"
* 输出:"100"
* 示例 2:
* 输入:a = "1010", b = "1011"
* 输出:"10101"
*/
思路:
思路一:我们首先想到的就是先将两个二进制转换为十进制求和,求得结果后,再将结果转换为二进制返回
思路二:上面的方法简单易懂,但存在的问题就是当数值太大超出int范围时,就会出错。所以我们模仿小学学的列竖式计算,将a,b右端 对齐,做加法,逢2进1,直到结束
思路二解析图:
核心代码:
思路一:
public class BinarySystem {
// 求二个二进制的和: 给你两个二进制字符串 `a` 和 `b` ,以二进制字符串的形式返回它们的和。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入a的值:");
String a = sc.next();
System.out.println("请输入b的值");
String b = sc.next();
System.out.println(addBinary(a,b));
}
public static String addBinary(String a, String b) {
// 定义变量保存结果
String result = "";
// 定义保存二进制转十进制的数
int numberA = Integer.parseInt(a,2);
int numberB = Integer.parseInt(b,2);
// 定义变量保存a+b的和用于计算二进制
int sum = numberA + numberB;
while (sum != 0) {
result = sum % 2 + result; // 把余数放在前面
sum = sum / 2; // 把商作为新的被除数
}
return result;
}
}
可简化为:
public class BinarySystem {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入a的值:");
String a = sc.next();
System.out.println("请输入b的值");
String b = sc.next();
System.out.println(addBinary(a,b));
}
public static String addBinary(String a, String b) {
// Integer.parseInt(a,2) 把二进制的数转为十进制 参数一:目标值 参数二:需要转换进制的类型 可不写 不写默认转为十进制的数
// Integer.toBinaryString() 把整数转为二进制的字符串
return Integer.toBinaryString(Integer.parseInt(a,2) + Integer.parseInt(b,2));
}
思路二:
public class BinaryNumber {
public static void main(String[] args) {
System.out.println(addBinary("11", "1"));
System.out.println(addBinary("101" , "10"));
}
public static String addBinary(String a, String b) {
StringBuilder sb = new StringBuilder();
// 获取输入内容的最后一项
int i = a.length() - 1;
int j = b.length() - 1;
//保存进位
int carry = 0;
// 循环遍历,从右往左进行遍历
while (i >= 0 || j >= 0 || carry != 0) {
// 依次获取i和j对应的数 将字符串数字转为整数数字
int aNum = (i >= 0) ? a.charAt(i--) - '0' : 0;
int bNum = (j >= 0) ? b.charAt(j--) - '0' : 0;
// 相加的和
carry = aNum + bNum + carry;
// 记录结果 c = 2 % = 0(进位); c = 1 % 2 = 1; c = 0 % c = 0;
sb.append(carry % 2);
// 是否进位 c = 2 / 2 = 1(进位); c = 1 / 2 = 0 ; c = 0 / 2 =0;
carry /= 2;
}
return sb.reverse().toString(); // 反转
}
}