给定两个数字作为输入,返回数字的总和。请注意,数字可能非常大,因此以字符串形式提供。
注意:如果不使用BigInteger类,我必须添加它们。
#Sample Input #1
add("2354725234782357","9999999999999999999999999988888888888")
#Sample Output #1
10000000000000000000002354714123671245
#Sample Input #2
add("1600","213")
#Sample Output #2
1813
MyApproach
由于数字很大,我没有得到输出。任何人都可以指导我做错了以及如何添加这些数字。
原始代码:
public String add(String str1, String str2) {
long number1 = Long.parseLong(str1);
long number2 = Long.parseLong(str2);
number1 = number1 + number2;
return "" + number1;
}
参数:
'2354725234782357' '9999999999999999999999999988888888888'
实际输出:
null
预期产出:
10000000000000000000002354714123671245
修改
根据MC Emperor的建议,我知道如何在不使用Any BigInteger的情况下添加非常大的数字。
Below is the code.
public String add(String a, String b)
{
String result = "";
if(a.length()>b.length())
{
int p=a.length()-b.length();
for(int i=0;i<p;i++)
{
b="0"+b;
}
}
if(b.length()>a.length())
{
int p=b.length()-a.length();
for(int i=0;i<p;i++)
{
a="0"+a;
}
}
if(a.length()==b.length())
{
int carry = 0;
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;
}
}
答案 0 :(得分:2)
试试这个。
String fix(String s, int size) {
int len = size - s.length();
if (len <= 0) return s;
return String.format("%0" + len + "d%s", 0, s);
}
public String add(String a, String b) {
int len = Math.max(a.length(), b.length());
a = fix(a, len);
b = fix(b, len);
StringBuilder r = new StringBuilder();
int carry = 0;
for (int i = len - 1; i >= 0; --i) {
int sum = carry + a.charAt(i) - '0' + b.charAt(i) - '0';
r.append((char)(sum % 10 + '0'));
carry = sum / 10;
}
if (carry > 0)
r.append((char)(carry + '0'));
return r.reverse().toString();
}
答案 1 :(得分:1)
您应该知道long长度默认为64位,其1用于符号,因此最大值为Uncaught TypeError: e.text is not a function
或263-1
。赋值告诉你数字可能非常大,所以我猜这些数字可以超过最大值。
9,223,372,036,854,775,807
不存在,我认为您的意思是Long.parseDouble(String)
; Long.parseLong(String)
,而是发出null
,因为输入值太大。该任务试图让您构建自己的机制来添加两个数字。这些是你应该采取的步骤:
NumberFormattingException
和"134"
。由于大小限制,您不应将它们转换为long。"258"
和4
中添加两个最右边的整数。如果该数字小于10,则可以进入下一个整数。否则,如果数字等于或大于10(在我们的例子中,它是8
),则从右侧(12
和3
)开始向下两个整数前进1对那些整数。在我们的案例中5
。如果该数字是10或更大,则将1添加到下一个整数。在我们的例子中,事实并非如此。重复这些步骤,直到您拥有该数字的所有数字。所以在代码中,你有这个:
3 + 5 + 1 = 9
我添加了很多评论来解释代码。
请注意,我也避免使用StringBuilder,并使用三元if语句来提高可读性。
答案 2 :(得分:0)
没有任何BigInteger,这是同样的事情。注释掉了解释代码。
/**
* Created by ankur on 10-12-2015.
*
* add two very large number without big integer
*/
public class BigStringAddition {
public static void main(String[] args){
System.out.println(StringAddition("2354725234782357","9999999999999999999999999988888888888"));
}
/*
function to return the result
*/
public static String StringAddition(String first, String second){
StringBuilder bufferRes = new StringBuilder();
/*
looping through the index for the break point or carry and adding the result
*/
for (int index1 = first.length() - 1, index2 = second.length() - 1, carry = 0; index1 >= 0 || index2 >= 0 || carry != 0; index1--, index2--){
// get the digit from the back and convert it into integer
int dig1 = index1 < 0 ? 0 : Integer.parseInt(Character.toString(first.charAt(index1)));
int dig2 = index2 < 0 ? 0 : Integer.parseInt(Character.toString(second.charAt(index2)));
// add both the digit and carry
int resDig = dig1 + dig2 + carry;
// if the digit is greater than > 9 carry will be 1
if (resDig > 9){
carry = 1;
resDig -= 10;
}else{
carry = 0;
}
bufferRes.append(resDig);
}
return bufferRes.reverse().toString();
}
}
输出:
10000000000000000000002354714123671245.
Ideone Link:https://ideone.com/vFiN1I