字符串乘法

3

我正在尝试将两个字符串相乘,但是得到的答案不正确。希望能得到帮助:

public class stringmultiplication {
    public static void main(String[] args) {
        String s1 = "10";
        String s2 = "20";
        int num = 0;
        for(int i = (s1.toCharArray().length); i > 0; i--)
            for(int j = (s2.toCharArray().length); j > 0; j--)
                num = (num * 10) + ((s1.toCharArray()[i - 1] - '0') * (s2.toCharArray()[j - 1] - '0'));
        System.out.println(num);
    }
}

2
我猜你的意思是要将两个字符串表示的数字相乘。由于这是一道面试题,我不想直接给你答案,但我可以提示你,答案比你写的要简单得多。 - Marcelo Cantos
2
你不想将s1和s2转换为数字并使用它们的原因是什么? - Jason Rogers
如果你指的是将其解析为整数,那么我对此解决方案不感兴趣,因为问题是要像在纸上一样做。 - Jony
2
你如何在纸上进行字符串乘法? - Falmarri
嘿!为什么是-1?我发了一个解决方案,可以让你的乘法过程和纸上的一样。你不能简单地将'(s1.toCharArray() [i-1]' 相乘,因为这样你会乘以字符的代码(例如 '0' 会给你48)。 - Petro Semeniuk
这个链接可能有助于长数字乘法。 https://dev59.com/j3I95IYBdhLWcg3w2h56#10532911 - Sai
4个回答

3
public static void main(String[] args) {
        String number1 = "108";
        String number2 = "84";

        char[] n1 = number1.toCharArray();
        char[] n2 = number2.toCharArray();

        int result = 0;

        for (int i = 0; i < n1.length; i++) {
            for (int j = 0; j < n2.length; j++) {
                result += (n1[i] - '0') * (n2[j] - '0')
                        * (int) Math.pow(10, n1.length + n2.length - (i + j + 2));
            }
        }
        System.out.println(result);
    }

这个应该是不使用整数的正确实现。

2
你能告诉我为什么是 (int) Math.pow(10, n1.length * 2 - (i + j + 2)) 吗?另外,如果有超过两位数,你的解决方案也不起作用。 - Jony
1
当结果超过数据类型的极限时,程序无法正常工作。比如说,我需要相乘两个1000000位数字的情况下,就必须只使用字符串。 - Kumar Saurabh
在这部分中:(int) Math.pow(10, n1.length * 2 - (i + j + 2)),为什么不直接使用:(int) Math.pow(10, (i + j))? - Evan_HZY
1
Petro的版本并不适用于所有情况。为了使其能够处理不同大小的字符串,只需将Math.pow调用替换为Math.pow(10,n1.length + n2.length - (i + j + 2))即可。 - dbow
1
@dbow 很好的发现!我修复了代码,考虑了数字长度不同的情况。 - Petro Semeniuk
显示剩余2条评论

2
您需要对数字进行逐位相乘,并正确处理10的幂次方。首先需要将字符串解析为整数,可以简化循环指针并只调用一次toCharArray。解析后,您可以相乘整数。如果不允许这样做,您需要像this one所示实现一个更复杂的算法。其中一种方法是创建一个(n + 1) x (m + n)数组(严格来说是一个数组的数组),其中m和n是每个数字的位数。它将被初始化为0,并可用作放置即时结果和最终结果行的区域,然后使用进位相加。显然,这是一个朴素的算法。例如,对于上面的示例:
int[][] intermediates = new int[3][4];

这是一个上界。

有没有一种方法可以在不将其解析为整数的情况下完成它? - Jony
@Jonatan,既然这是面试问题,下一个可能的答案是(基于Matthew Flaschen的答案):首先,您正在创建10x10矩阵,并使用前十个数字的所有乘法结果填充它。之后,您可以不必进行乘法运算,而只需查看给定结果的矩阵值(例如,“5”和“6”的矩阵值为matrix [5] [6]),并乘以pow(10,_您将在字符串中使用字符的索引_)。 - Petro Semeniuk

1

以下是我建议的解决方案,你忘记做的是保留中间值。

public class T{  
    public static void main(String[] args) {     

        char[] num1 = "127".toCharArray();     
        char[] num2 = "32".toCharArray();

        int[] intermediate = new int[num1.length];

        for (int i = 0 ; i < num1.length ; i++ )  { 

                for(int j = 0 ; j < num2.length ; j++ ) { 


                  int d1 = num1[num1.length - i - 1]-'0';
                  int d2 = num2[num2.length - j - 1]-'0';


                  intermediate[i] += d1 * d2 * (int) Math.pow(10,j);

                  System.out.printf("  %d X %d = %d\n", d1, d2, intermediate[i]);

                }     

             intermediate[i] *= (int) Math.pow(10,i);

             System.out.println(" intermediate : " + intermediate[i]);
        }     


        int sum = 0;

        for(int i : intermediate) {
            sum += i;
        }

        System.out.println("Sum is = " + sum); 
    }
} 

0
我发现Peter的算法使用pow函数有点令人困惑。 这里基本上是相同的算法。 将您的字符串转换为char[],然后运行此代码。

public static int multiply (char A[], char B[]){
  int totalSum = 0, sum = 0;
  for (int i = 0; i < A.length; i++){
   sum = 0;

   for (int j = 0; j < B.length; j++){
    sum *= 10;
    sum += (A[i] - '0') * (B[j] - '0');
    
   }
   totalSum *=10;
   totalSum += sum;
  }

  return totalSum;
 }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接