Я знаю, что это, вероятно, не самый эффективный способ кодирования, но это то, что у меня есть до сих пор, и оно работает до тех пор, пока числа не станут действительно большими. Код должен считывать 2 числа из файла, например "052" и "61". Затем он должен отсортировать первое число от наибольшего к наименьшему, чтобы сделать число как можно большим, а второе число от наименьшего к наибольшему, чтобы сделать его как можно меньшим. (520 и 16) Затем выводится разница между ними, в данном случае: 504.
Два из них: «3827367453723784675745843783623672348745389734268374687» и «1682761482512674172712635416571265716235471625176235741». Сортировка чисел от наибольшего к наименьшему и от наименьшего к наибольшему работает нормально, но когда я пытаюсь разобрать его на целое число, выдается NumberFormatException
. Я решил, что это число слишком велико для хранения в int
, поэтому я попытался выполнить синтаксический анализ в Long
, но это привело к той же ошибке.
Что я сделал, так это прочитал числа как String
s, а затем создал массив 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);
}
}
}
1682761482512674172712635416571265716235471625176235741
выходит далеко за пределы диапазона целых чисел. - person RainMaker   schedule 04.03.2014