【题目描述】:输入两个二进制数,求两个数相加的结果 【输入格式】:从键盘输入两个正整数n1和n2,代表两个二进制数的位数,接下来两行输入长度分别为n1和n2的数组,数组元素为0或者1(长度大于1时,第一个元素必不为0),数组元素用空格隔开 【输出格式】:依次输出一个由0和1组成的数组,表示输入的两个二进制数的和 输入输出示例如下: 请输入两个二进制数的位数(n1 n2): 3 4 请输入第一个二进制数:1 0 1 请输入第二个二进制数:1 1 0 1 两数相加的结果为:1 0 0 1 0 【数据范围】两个二进制数的长度(位数)均不超过10000 进阶要求: 你能进一步计算两个二进制相减的结果吗?(可不考虑出现负数的情况)
时间: 2024-02-13 17:04:56 浏览: 152
两个数相加
以下是Java的解答代码:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入两个二进制数的位数(n1 n2): ");
int n1 = scanner.nextInt();
int n2 = scanner.nextInt();
int[] a = new int[n1];
int[] b = new int[n2];
System.out.print("请输入第一个二进制数:");
for (int i = 0; i < n1; i++) {
a[i] = scanner.nextInt();
}
System.out.print("请输入第二个二进制数:");
for (int i = 0; i < n2; i++) {
b[i] = scanner.nextInt();
}
int[] res = addBinary(a, b);
System.out.print("两数相加的结果为:");
for (int i = res.length - 1; i >= 0; i--) {
System.out.print(res[i] + " ");
}
}
public static int[] addBinary(int[] a, int[] b) {
int n = a.length, m = b.length;
int[] res = new int[Math.max(n, m) + 1];
int carry = 0;
for (int i = 0; i < res.length; i++) {
int sum = carry;
if (i < n) sum += a[n - i - 1];
if (i < m) sum += b[m - i - 1];
res[res.length - i - 1] = sum % 2;
carry = sum / 2;
}
if (res[0] == 0) {
int[] newRes = new int[res.length - 1];
System.arraycopy(res, 1, newRes, 0, newRes.length);
return newRes;
}
return res;
}
}
```
对于两个二进制数,我们可以将其转换为整型数组a和b,然后从低位到高位逐位相加。使用一个变量carry记录进位,对于每一位i,我们先将carry加到和上,再加上a[i]和b[i]。将结果对2取余得到当前位的结果,将结果除以2得到下一位的进位,最后得到的结果数组即为两数相加的结果。注意,最高位可能会有进位,因此结果数组的长度可能会比a和b数组的长度大1,需要在开辟数组时预留一位。如果最高位没有进位,需要将结果数组的第一位去掉。
阅读全文