添加非常大数字的输出未按预期进行

时间:2015-12-10 08:18:26

标签: java string

给定两个数字作为输入,返回数字的总和。请注意,数字可能非常大,因此以字符串形式提供。

注意:如果不使用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;
 }
}    

3 个答案:

答案 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 function263-1。赋值告诉你数字可能非常大,所以我猜这些数字可以超过最大值。

  • 9,223,372,036,854,775,807不存在,我认为您的意思是Long.parseDouble(String);
  • 您的代码未按照您的说明输出Long.parseLong(String),而是发出null,因为输入值太大。

该任务试图让您构建自己的机制来添加两个数字。这些是你应该采取的步骤:

  1. 取两个输入字符串,例如NumberFormattingException"134"。由于大小限制,您不应将它们转换为long。
  2. 在我们的案例"258"4中添加两个最右边的整数。如果该数字小于10,则可以进入下一个整数。否则,如果数字等于或大于10(在我们的例子中,它是8),则从右侧(123)开始向下两个整数前进1对那些整数。在我们的案例中5。如果该数字是10或更大,则将1添加到下一个整数。在我们的例子中,事实并非如此。重复这些步骤,直到您拥有该数字的所有数字。
  3. 所以在代码中,你有这个:

    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