所以我一直在努力完成这个任务,我必须写一个java代码来将两个二进制数相乘为一个字符串。我不知道如何将它们相乘并保存在单独的字符串中,这样我就可以在最后添加它们。有人能给我一些提示吗?我必须用给定的字符串做乘法,但不能将它们转换为整数。我知道如何在纸上做乘法,但不知道如何将其转换为代码。这是我目前为止的代码。
public static String multiply(String binary1, String binary2) {
String b1 = new StringBuilder(binary1).reverse().toString();
String b2 = new StringBuilder(binary2).reverse().toString();
int[] m = new int[binary1.length()+binary2.length()];
for (int i = 0; i < binary1.length(); i++) {
for (int j = 0; j < binary2.length(); j++) {
m[i+j] += (b1.charAt(i)-'0')*(b2.charAt(j)-'0');
}
}
StringBuilder sb = new StringBuilder();
for(int i=0; i < m.length; i++) {
int mod = m[i]%10;
int carry = m[i]/10;
if (i+1 < m.length) {
m[i + 1] = m[i + 1] + carry;
}
sb.insert(0, mod);
}
// remove front zeros
while (sb.charAt(0) == '0' && sb.length() > 1) {
sb.deleteCharAt(0);
}
return sb.toString();
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("1. Factor: ");
String input1 = scan.next("(0|1)*");
System.out.print("2. Factor: ");
String input2 = scan.next("(0|1)*");
scan.close();
System.out.println("Result: " + multiply(input1, input2));
}
正如我上面提到的,解决方案将与小数乘法相同,所以你可以简单地得到这个解决方案。下面是leetcode的解决方案代码。我认为使用转换到int或使用像Bigintger这样的东西不是你要求做的。
public String multiply(String num1, String num2) {
int m = num1.length(), n = num2.length();
int[] pos = new int[m + n];
for(int i = m - 1; i >= 0; i--) {
for(int j = n - 1; j >= 0; j--) {
int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
int p1 = i + j, p2 = i + j + 1;
int sum = mul + pos[p2];
pos[p1] += sum / 10;
pos[p2] = (sum) % 10;
}
}
StringBuilder sb = new StringBuilder();
for(int p : pos) if(!(sb.length() == 0 && p == 0)) sb.append(p);
return sb.length() == 0 ? "0" : sb.toString();
}
附注:为了理解一张纸上的乘法过程,请检查这个。从这里你可以导出编程解决方案
看看有没有帮助:
// your 2 binary strings
String aBin = "100001";
String bBin = "111110";
// convert them to int
int a = Integer.parseInt(aBin, 2);
int b = Integer.parseInt(bBin, 2);
// Do the math you want and store the result on 'r'
int r = a * b;
// If you want, convert the result to the binary string format
String rBin = Integer.toBinaryString(r);
编辑1:
如果数字不适合int
,请使用biginger
:
// your 2 binary strings
String aBin = "100001";
String bBin = "111110";
// convert them to BigInteger
BigInteger a = new BigInteger(aBin, 2);
BigInteger b = new BigInteger(bBin, 2);
// Do the math you want and store the result on 'r'
BigInteger r = a.multiply(b);
// If you want, convert the result to the binary string format
String rBin = r.toString(2);
编辑2:
了解OP想要什么后:
public static String multiply(String binary1, String binary2) {
try {
binary1 = binary1.substring(binary1.indexOf('1'));
binary2 = binary2.substring(binary2.indexOf('1'));
} catch (StringIndexOutOfBoundsException e) {// some number is 0
return "0";
}
// 1st step: multiply each bit of binary2 by binary1
String zero = IntStream.range(0, binary1.length()).mapToObj(v -> "0").collect(Collectors.joining());
StringBuilder lpad = new StringBuilder(IntStream.range(0, binary2.length() - 1).mapToObj(v -> "0").collect(Collectors.joining()));
StringBuilder rpad = new StringBuilder();
String[] prod = new String[binary2.length()];
for (int i = binary2.length() - 1, j = 0; i >= 0; i--, j++) {
prod[j] = lpad.toString()
.concat(binary2.charAt(i) == '1' ? binary1 : zero)
.concat(rpad.toString());
if (lpad.length() > 0) {
lpad.deleteCharAt(0);
rpad.append('0');
}
}
// 2nd step: sum the products
String result = prod[0];
for (int i = 1; i < prod.length; i++) {
StringBuilder sum = new StringBuilder();
int[] carry = new int[binary1.length() + binary2.length()];
for (int j = binary2.length() + binary1.length() - 2; j >= 0; j--) {
int r = result.charAt(j) - '0' + prod[i].charAt(j) - '0';
if (r > 1) {
sum.append(carry[j + 1]);
carry[j] = 1;
} else if ((r += carry[j + 1]) > 1) {
sum.append('0');
carry[j] = 1;
} else {
sum.append(r);
}
}
if (carry[0] == 1) {
sum.append('1');
}
result = sum.reverse().toString();
}
return result;
}
本文向大家介绍8085程序将两个16位二进制数相乘,包括了8085程序将两个16位二进制数相乘的使用技巧和注意事项,需要的朋友参考一下 现在让我们看一下Intel 8085微处理器的程序。该程序将计算两个16位数字的乘法。 问题陈述 编写8085汇编语言程序,将两个分别存储在8000H -8001H和8002H-8003H的16位数字相乘。 讨论区 该程序从存储单元8000H – 8001Hand
有人请解释一下。为什么下面的程序产生16个?
我如何将一个写为二进制的字符串转换为二进制(字节数组)? 如果我有一个字符串: 下面是当我将二进制设置为字节数组时发生的情况(字节数组返回48,这是ASCII) 我不擅长解释,所以希望上面的例子足以告诉你我想要什么。
问题内容: 当将int转换为二进制时,如何将其输出为8个字符,当前仅显示1且缺少7个零 码 示例输出到0000 0001 问题答案: 我不确定这是否是您的意思,但是类似 会产生
问题内容: 我写了一些代码将十六进制显示字符串转换为十进制整数。但是,当输入类似100a或625b(带有字母的东西)时,我得到了这样的错误: java.lang.NumberFormatException:对于输入字符串:java.lang.Integer.parseInt(未知源)处的java.lang.NumberFormatException.forInputString(未知源)处为“ 1
我正在写一个Rust程序,读取I2C总线并保存数据。当我读取I2C总线时,我会得到十六进制值,比如,,等等。 现在,我只能将其作为字符串处理并按原样保存。有没有办法把它解析成一个整数?它有内置的功能吗?