Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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 使用字符串添加两个大长度数字_Java_String - Fatal编程技术网

Java 使用字符串添加两个大长度数字

Java 使用字符串添加两个大长度数字,java,string,Java,String,我似乎不明白这个用于添加两个字符串的方法有什么错。当存储每个添加的数字并最终显示时,它有一个缓冲区。但是,当两个巨大的数字(大于10位)相加时,它只会截断,而不会存储字符串的其余部分 public static void add(String a,String b){ StringBuilder buf = new StringBuilder(); if((a.length() - 1==0)&&(a.charAt(0)=='0')){ Syste

我似乎不明白这个用于添加两个字符串的方法有什么错。当存储每个添加的数字并最终显示时,它有一个缓冲区。但是,当两个巨大的数字(大于10位)相加时,它只会截断,而不会存储字符串的其余部分

public static void add(String a,String b){
    StringBuilder buf = new StringBuilder();
    if((a.length() - 1==0)&&(a.charAt(0)=='0')){
        System.out.println(b);
        return;
    }
    if((b.length() - 1==0)&&(b.charAt(0)=='0')){
        System.out.println(a);
        return;
    }
    else{
    for ( int i1 = a.length() - 1, i2 = b.length() - 1, carry = 0;
          (i1 >= 0 && i2 >= 0) || carry != 0;i1--, i2-- ) {
        int digit1 = i1 < 0 ? 0 :
                     Integer.parseInt(Character.toString(a.charAt(i1)));
        int digit2 = i2 < 0 ? 0 :
                     Integer.parseInt(Character.toString(b.charAt(i2)));

        int digit = digit1 + digit2 + carry;
        if (digit > 9) {
            carry = 1;
            digit -= 10;
        } else {
            carry = 0;
        }

        buf.append(digit);
    }
   }
    System.out.println(buf.reverse().toString());
}
publicstaticvoidadd(字符串a、字符串b){
StringBuilder buf=新的StringBuilder();
如果((a.length()-1==0)&&(a.charAt(0)==0')){
系统输出打印ln(b);
返回;
}
如果((b.length()-1==0)和((b.charAt(0)==0')){
系统输出打印项次(a);
返回;
}
否则{
对于(inti1=a.length()-1,i2=b.length()-1,进位=0;
(i1>=0&&i2>=0)| |进位!=0;i1--,i2--){
int digit1=i1<0?0:
整数.parseInt(Character.toString(a.charAt(i1));
int digit2=i2<0?0:
整数.parseInt(Character.toString(b.charAt(i2));
整数位数=数字1+数字2+进位;
如果(数字>9){
进位=1;
数字-=10;
}否则{
进位=0;
}
buf.追加(数字);
}
}
System.out.println(buf.reverse().toString());
}

由于当
i1
i2
都达到负值时需要停止,因此该条件应为

i1 >= 0 || i2 >= 0 || carry != 0
而不是

(i1 >= 0 && i2 >= 0) || carry != 0

由于当
i1
i2
均达到负值时需要停止,因此该条件应为

i1 >= 0 || i2 >= 0 || carry != 0
而不是

(i1 >= 0 && i2 >= 0) || carry != 0

由于当
i1
i2
均达到负值时需要停止,因此该条件应为

i1 >= 0 || i2 >= 0 || carry != 0
而不是

(i1 >= 0 && i2 >= 0) || carry != 0

由于当
i1
i2
均达到负值时需要停止,因此该条件应为

i1 >= 0 || i2 >= 0 || carry != 0
而不是

(i1 >= 0 && i2 >= 0) || carry != 0


只要使用BigInteger,整个方法就有三行长。

只要使用BigInteger,整个方法就有三行长。

只要使用BigInteger,整个方法就有三行长。

只要使用BigInteger,然后,整个方法有三行长。

将变量从int改为long应该可以做到这一点。如果您想了解如何真正做到这一点,请检查BigInteger的源代码:@jbutler483
int
vs.
long
在这里应该无关紧要。循环一次只处理两个数字(加上可能的进位),因此它从不处理19以上的值。将变量从int更改为long应该可以做到这一点。如果您想了解如何真正做到这一点,请检查BigInteger的源代码:@jbutler483
int
vs.
long
在这里应该无关紧要。循环一次只处理两个数字(加上可能的进位),因此它从不处理19以上的值。将变量从int更改为long应该可以做到这一点。如果您想了解如何真正做到这一点,请检查BigInteger的源代码:@jbutler483
int
vs.
long
在这里应该无关紧要。循环一次只处理两个数字(加上可能的进位),因此它从不处理19以上的值。将变量从int更改为long应该可以做到这一点。如果您想了解如何真正做到这一点,请检查BigInteger的源代码:@jbutler483
int
vs.
long
在这里应该无关紧要。循环一次只能处理两个数字(加上一个可能的进位),因此它从不处理19以上的值。嘿,问题仍然存在,请尝试将497987965和497987965相加13544@AkhilBalaji非常适合我()。您一定忘了将
497987965
a
long
(该值不适合
int
)。多亏它起了作用。嘿,问题仍然存在,请尝试添加497987965和13544@AkhilBalaji非常适合我()。您一定忘了将
497987965
a
long
(该值不适合
int
)。多亏它起了作用。嘿,问题仍然存在,请尝试添加497987965和13544@AkhilBalaji非常适合我()。您一定忘了将
497987965
a
long
(该值不适合
int
)。多亏它起了作用。嘿,问题仍然存在,请尝试添加497987965和13544@AkhilBalaji非常适合我()。您一定忘了将
497987965
a
long
(该值不适合
int
)设置为长值。谢谢您让它正常工作。