当前位置: 首页 > 知识库问答 >
问题:

将两个二进制数相乘为字符串,而不使用整数

邵兴怀
2023-03-14

所以我一直在努力完成这个任务,我必须写一个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));
}

共有2个答案

笪成周
2023-03-14

正如我上面提到的,解决方案将与小数乘法相同,所以你可以简单地得到这个解决方案。下面是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();
}

附注:为了理解一张纸上的乘法过程,请检查这个。从这里你可以导出编程解决方案

东郭俊楠
2023-03-14

看看有没有帮助:

        // 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总线时,我会得到十六进制值,比如,,等等。 现在,我只能将其作为字符串处理并按原样保存。有没有办法把它解析成一个整数?它有内置的功能吗?