Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何添加两个非常大的数字,而不考虑其大小,而不使用BigInteger数据类型?_Java_Biginteger - Fatal编程技术网

在Java中,如何添加两个非常大的数字,而不考虑其大小,而不使用BigInteger数据类型?

在Java中,如何添加两个非常大的数字,而不考虑其大小,而不使用BigInteger数据类型?,java,biginteger,Java,Biginteger,我需要在不使用biginger的情况下添加两个非常大的数字。我使用了两个字符串参数,但下面的代码仅适用于长度相等的字符串,否则会抛出IndexOutOfBoundsException。我如何通过添加大数字来解决这个问题,而不考虑它们的长度 public static String add(String a, String b) { int carry = 0; String result = ""; for (int i = a.length() - 1; i >

我需要在不使用
biginger
的情况下添加两个非常大的数字。我使用了两个字符串参数,但下面的代码仅适用于长度相等的字符串,否则会抛出
IndexOutOfBoundsException
。我如何通过添加大数字来解决这个问题,而不考虑它们的长度

public static String add(String a, String b) {
    int carry = 0;
    String result = "";

    for (int i = a.length() - 1; i >= 0; i--) {
      int digitA = a.charAt(i) - 48;
      int digitB = b.charAt(i) - 48;

      int resultingNumber = digitA + digitB + carry;
      if (resultingNumber >= 10) {
        result = (resultingNumber % 10) + result;
        carry = 1;
      } else {
        result = resultingNumber + result;
        carry = 0;
      }
    }
    if (carry > 0) {
      result = carry + result;
    }
    return result;
}

您可以在较短的字符串前面加上零,使其与其他数字的长度相匹配:

private static String leftPad(String s, int length) {
    if (s.length() >= length)
        return s;

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < length - s.length(); i++)
        sb.append("0");

    return sb.toString() + s;
}

public static String add(String originalA, String originalB) {

    int maxLength = Math.max(originalA.length(), originalB.length());
    String a = leftPad(originalA, maxLength);
    String b = leftPad(originalB, maxLength);

    ... rest of your method
private静态字符串leftPad(字符串s,int-length){
如果(s.length()>=长度)
返回s;
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
您可以在较短的字符串前面加上零,使其与其他数字的长度相匹配:

private static String leftPad(String s, int length) {
    if (s.length() >= length)
        return s;

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < length - s.length(); i++)
        sb.append("0");

    return sb.toString() + s;
}

public static String add(String originalA, String originalB) {

    int maxLength = Math.max(originalA.length(), originalB.length());
    String a = leftPad(originalA, maxLength);
    String b = leftPad(originalB, maxLength);

    ... rest of your method
private静态字符串leftPad(字符串s,int-length){
如果(s.length()>=长度)
返回s;
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
您可以将字符串保留为零,如下所示:

    int longestString = Math.max(a.length(), b.length());
    a = String.format("%1$" + longestString + "s", a).replace(' ', '0');
    b = String.format("%1$" + longestString + "s", b).replace(' ', '0');
这将添加引线空间以填充“间隙”,然后将其替换为零

类别: 输入/输出:
您可以将字符串保留为零,如下所示:

    int longestString = Math.max(a.length(), b.length());
    a = String.format("%1$" + longestString + "s", a).replace(' ', '0');
    b = String.format("%1$" + longestString + "s", b).replace(' ', '0');
这将添加引线空间以填充“间隙”,然后将其替换为零

类别: 输入/输出:
不需要用零填充任何参数。另外,为了获得更好的性能,不要使用
String+String

为结果创建一个
char[]
。由于结果可能比最长的输入长1,请按该大小创建

然后从输入字符串的末尾迭代,设置结果中的每个字符

然后消除因输入未溢出或输入具有前导零而产生的任何前导零

最后,使用构造函数从
char[]
创建一个
String

像这样:

public static String add(String a, String b) {
    int i = a.length();
    int j = b.length();
    int k = Math.max(i, j) + 1; // room for carryover
    char[] c = new char[k];
    for (int digit = 0; k > 0; digit /= 10) {
        if (i > 0)
            digit += a.charAt(--i) - '0';
        if (j > 0)
            digit += b.charAt(--j) - '0';
        c[--k] = (char) ('0' + digit % 10);
    }
    for (k = 0; k < c.length - 1 && c[k] == '0'; k++) {/*Skip leading zeroes*/}
    return new String(c, k, c.length - k);
}
输出

1234+2345=3579=3579
12345 + 12345 = 24690 = 24690
54321 + 54321 = 108642 = 108642
99999 + 99999 = 199998 = 199998
5 + 1234 = 1239 = 1239
5 + 12345 = 12350 = 12350
1 + 99999 = 100000 = 100000
001 + 00002 = 3 = 3
000 + 00000 = 0 = 0

不需要用零填充任何参数。另外,为了获得更好的性能,不要使用
String+String

为结果创建一个
char[]
。由于结果可能比最长的输入长1,请按该大小创建

然后从输入字符串的末尾迭代,设置结果中的每个字符

然后消除因输入未溢出或输入具有前导零而产生的任何前导零

最后,使用构造函数从
char[]
创建一个
String

像这样:

public static String add(String a, String b) {
    int i = a.length();
    int j = b.length();
    int k = Math.max(i, j) + 1; // room for carryover
    char[] c = new char[k];
    for (int digit = 0; k > 0; digit /= 10) {
        if (i > 0)
            digit += a.charAt(--i) - '0';
        if (j > 0)
            digit += b.charAt(--j) - '0';
        c[--k] = (char) ('0' + digit % 10);
    }
    for (k = 0; k < c.length - 1 && c[k] == '0'; k++) {/*Skip leading zeroes*/}
    return new String(c, k, c.length - k);
}
输出

1234+2345=3579=3579
12345 + 12345 = 24690 = 24690
54321 + 54321 = 108642 = 108642
99999 + 99999 = 199998 = 199998
5 + 1234 = 1239 = 1239
5 + 12345 = 12350 = 12350
1 + 99999 = 100000 = 100000
001 + 00002 = 3 = 3
000 + 00000 = 0 = 0

在较短的
字符串中插入前导零
?此外,我会使用
-“0”;
而不是
-48;
您可以尝试通过添加前导零来将较小的一个与较长的一个对齐。
BigInteger
是该作业的工具。在较短的
字符串中插入前导零
?此外,我会在中使用
-“0”;
除了
-48;
之外,您还可以尝试通过添加前导零将较小的一个与较长的一个对齐。
biginger
是该作业的工具。