【问题标题】:Multiply two Binary numbers as a String without using Integer在不使用整数的情况下将两个二进制数作为字符串相乘
【发布时间】:2019-07-19 06:15:53
【问题描述】:

所以我一直在为这个任务苦苦挣扎,我必须编写一个 java 代码来将 2 个二进制数作为字符串相乘。我不知道如何将它们相乘并将它们保存在单独的字符串中,以便我可以在最后添加它们。有人可能会给我一些提示,我该如何开始或类似的东西? 我必须对给定的字符串进行乘法运算,并且不能将它们转换为整数。我知道如何在纸上进行乘法运算,但不知道如何将其放入代码中。 到目前为止,这是我的代码。

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));
}

【问题讨论】:

  • 你会如何在纸上用非二进制数来做呢?假设您想乘以 135x323。你会如何处理它?
  • 欢迎使用 Stack Overflow。只要您愿意提出可以显示研究成果的好问题,您就可以在这里获得很多帮助。在这种情况下,我想知道您有什么代码,或者您是否有代码。我们不会从头开始教你 Java。
  • 你需要实现long multiplication
  • 这里提示一下,为了将二进制字符串转成int,可以使用Integer.parseInt("1001101100", 2)。我相信这是您真正想要的,其他 cmets 假设您正在评估长乘法,但也许这就是您想要的。
  • 到目前为止,您尝试了什么?什么对你不起作用?向我们展示您的代码。好的,如果您正在寻找从哪里开始:youtube.com/watch?v=QW0XNZPyWUk

标签: java string binary


【解决方案1】:

看看是否有帮助:

        // 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,请改用 BigInteger

        // 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;
    }

【讨论】:

  • 这将在数字适合int 限制时起作用。但通常在数字不适合 intlong 时使用字符串算术。
  • 已编辑以包含使用 BigInteger 的替代方法
  • 谢谢,但我必须与字符串相乘,不能转换为任何整数。这是这里最大的问题..
  • 我再次编辑了我的答案...看看它是否符合您的要求。
  • 不完全是..实际上我的代码有效,但二进制数的加法部分不正确,我真的不知道该怎么做..
【解决方案2】:

正如我上面提到的,解决方案将与小数乘法相同,因此您可以简单地得到这个solution。下面是来自 leetcode 的解决方案代码。我认为使用转换为 int 或使用 BigInteger 之类的东西不是您要求做的。

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();
}

附:要了解纸上的乘法过程,请查看this。从这里你可以导出编程解决方案

【讨论】:

    猜你喜欢
    • 2020-05-06
    • 2019-05-18
    • 2012-09-16
    • 2010-11-24
    • 2020-02-24
    • 2023-03-28
    • 1970-01-01
    • 2016-01-08
    • 2018-03-06
    相关资源
    最近更新 更多