package LESSION;
/*程序问题注释开始
程序的版权和版本声明部分
Copyright © 2024,DNUI-stu
All rights reserved.
文件名称: Leetcode练习题
作 者: 山北为谷
完成日期: 2024 年 08月 19日
版 本 号: 001
对任务及求解方法的描述部分
问题描述:
是用来实现两个二进制字符串的加法。它接收用户通过标准输入(通常是键盘)输入的两个二进制数(以字符串形式),然后计算并输出这两个二进制数相加的结果,同样以字符串形式表示。
*/
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String a = scanner.nextLine();
String b = scanner.nextLine();
scanner.close();
String sum = addBinaryStrings(a, b);
System.out.println(sum);
}
public static String addBinaryStrings(String a, String b) {
StringBuilder result = new StringBuilder();
int carry = 0 ;
int i = a.length() - 1;
int j = b.length() - 1;
while (i >= 0 || j >= 0 || carry > 0) {
int digitA = i >= 0 ? a.charAt(i) - '0' : 0;
int digitB = j >= 0 ? b.charAt(j) - '0' : 0;
int sum = digitA + digitB + carry;
// 计算当前位的值和进位
result.append(sum % 2);
carry = sum / 2;
i--;
j--;
}
// 反转结果字符串,因为我们是从最低位开始构建的
return result.reverse().toString();
}
}
ai解释:
这个程序是用来实现两个二进制字符串的加法。它接收用户通过标准输入(通常是键盘)输入的两个二进制数(以字符串形式),然后计算并输出这两个二进制数相加的结果,同样以字符串形式表示。
下面是程序的详细工作流程:
初始化:程序首先通过Scanner类创建一个扫描器对象scanner,用于从标准输入读取数据。
输入数据:使用scanner.nextLine()方法连续读取两行输入,分别赋值给字符串变量a和b。这两行输入被假定为两个二进制数(由0和1组成的字符串)。
关闭扫描器:使用scanner.close()方法关闭扫描器对象,这是一个好习惯,尤其是在处理完输入之后,可以释放与之关联的资源。
执行加法:调用addBinaryStrings(a, b)方法,将输入的两个二进制字符串作为参数传递。这个方法会计算并返回这两个二进制数相加的结果,同样以字符串形式。
输出结果:将addBinaryStrings方法的返回值(即两个二进制数相加的结果)输出到标准输出(通常是控制台)。
addBinaryStrings方法的工作原理:
创建一个StringBuilder对象result,用于构建最终的二进制字符串结果。
初始化进位carry为0,以及两个索引i和j,分别指向输入字符串a和b的最后一个字符(即最低位)。
使用一个while循环,条件为i或j中至少有一个索引大于等于0,或者进位carry大于0。这是必要的,因为即使两个字符串长度不同,或者最后一个加法运算产生了进位,我们也需要继续处理。
在每次循环中,从a和b中取出当前索引位置的字符(如果索引超出字符串长度,则视为0),将它们转换为整数,加上进位carry,得到当前位的和。
将当前位的和对2取余的结果添加到result字符串的末尾(即当前位的值),然后计算进位(即当前位的和除以2的商)。
将索引i和j减1,以移动到下一个较低位。
当循环结束时,result中包含了从最低位到最高位的二进制结果,但由于我们是从最低位开始构建的,因此需要调用result.reverse()来反转字符串,然后调用toString()方法将其转换为字符串并返回。
这样,程序就实现了两个二进制字符串的加法操作。