NumberFormatException при разборе больших чисел?

Я знаю, что это, вероятно, не самый эффективный способ кодирования, но это то, что у меня есть до сих пор, и оно работает до тех пор, пока числа не станут действительно большими. Код должен считывать 2 числа из файла, например "052" и "61". Затем он должен отсортировать первое число от наибольшего к наименьшему, чтобы сделать число как можно большим, а второе число от наименьшего к наибольшему, чтобы сделать его как можно меньшим. (520 и 16) Затем выводится разница между ними, в данном случае: 504.

Два из них: «3827367453723784675745843783623672348745389734268374687» и «1682761482512674172712635416571265716235471625176235741». Сортировка чисел от наибольшего к наименьшему и от наименьшего к наибольшему работает нормально, но когда я пытаюсь разобрать его на целое число, выдается NumberFormatException. Я решил, что это число слишком велико для хранения в int, поэтому я попытался выполнить синтаксический анализ в Long, но это привело к той же ошибке.

Что я сделал, так это прочитал числа как Strings, а затем создал массив String, сохраняя каждое число в отдельном индексе. Затем я создал массив int, в котором у меня был почти такой же массив, только в целочисленной форме вместо String. Затем я отсортировал массивы int. Затем я создал еще один String для хранения новых отсортированных чисел, затем попытался разобрать этот String, и именно здесь выдается исключение.

Какие-либо предложения?

import java.io.*;    
import java.util.*;    
import java.text.*;    
import static java.lang.System.*;    

public class BigDif    
{    
    public static void main(String[] args) throws IOException    
    {    
        Scanner scan = new Scanner (new File ("BigDif.dat"));    
        int numRuns = scan.nextInt();    
        scan.nextLine();    

    for (int i = 0; i < numRuns; i++)    
    {
        String firstNum = scan.nextLine();
        String secondNum = scan.nextLine();
        String[] firstNum2 = new String[firstNum.length()];
        String[] secondNum2 = new String[secondNum.length()];
        int[] firstNum3 = new int[firstNum.length()];
        int[] secondNum3 = new int[secondNum.length()];
        int big = 0;
        int notBig = 0;
        String firstNum4 = null;
        String secondNum4 = null;
        int firstNum5 = 0;
        int secondNum5 = 0;
        for (int j = 0; j < firstNum.length(); j++)
        {
            firstNum2[j] = Character.toString(firstNum.charAt(j));
        }
        for (int j = 0; j < secondNum.length(); j++)
        {
            secondNum2[j] = Character.toString(secondNum.charAt(j));
        }
        for (int j = 0; j < firstNum2.length; j++)
        {
            firstNum3[j] = Integer.parseInt(firstNum2[j]);
            secondNum3[j] = Integer.parseInt(secondNum2[j]);
        }
        Arrays.sort(firstNum3);
        Arrays.sort(secondNum3);
        for (int m = 0; m < firstNum3.length; m++)
        {
            if (m == 0)
                firstNum4 = (Integer.toString(firstNum3[m]));
            else
                firstNum4 = (Integer.toString(firstNum3[m]))+ firstNum4;
        }

        for (int m = 0; m < secondNum3.length; m++)
        {
            if (m == 0)
                secondNum4 = (Integer.toString(secondNum3[m]));
            else
                secondNum4 += (Integer.toString(secondNum3[m]));
        }

        firstNum5 = Integer.parseInt(firstNum4); //the exception is thrown here
        secondNum5 = Integer.parseInt(secondNum4);

        if (firstNum5 >= secondNum5)
        {
            big = firstNum5;
            notBig = secondNum5;
        }
        else
        {
            big = secondNum5;
            notBig = firstNum5;
        }

        out.println(big - notBig);
    }
    }    
}    

person Oscar F    schedule 04.03.2014    source источник
comment
1682761482512674172712635416571265716235471625176235741 выходит далеко за пределы диапазона целых чисел.   -  person RainMaker    schedule 04.03.2014


Ответы (2)


3827367453723784675745843783623672348745389734268374687 слишком велико для длинного. Используйте BigInteger, что позволяет использовать произвольные большие целые числа.

person JB Nizet    schedule 04.03.2014
comment
В частности, BigInteger(String) конструктор. - person Jason C; 04.03.2014

Вы можете попробовать использовать BigInteger в качестве диапазона из BigIntegers позволит вам сохранить это большое число, поскольку 1682761482512674172712635416571265716235471625176235741 и 3827367453723784675745843783623672348745389734268374687 слишком большие числа, и они выходят за пределы диапазона целых чисел.

Попробуйте BigInteger (String val) конструктор

Преобразует десятичное строковое представление BigInteger в BigInteger. Представление String состоит из необязательного знака минус, за которым следует последовательность из одной или нескольких десятичных цифр. Преобразование символа в цифру обеспечивается Character.digit. Строка не может содержать никаких посторонних символов (например, пробелов).

person Rahul Tripathi    schedule 04.03.2014