我知道这可能不是最有效的编码方式,但这是我到目前为止所做的工作,直到数字变得非常大。代码应该从文件中读取2个数字,例如“052”和“61”。然后,它应该将第一个数字从最大值排序到最小值,以使数字尽可能大,第二个数字从最小到最大,以使其尽可能小。 (520& 16)然后它打印两者的差异,在这种情况下:504.
其中两个数字是“3827367453723784675745843783623672348745389734268374687”和“1682761482512674172712635416571265716235471625176235741”。从最大到最小,从最小到最大的数字的排序工作正常,但是当我尝试将其解析为整数时,抛出NumberFormatException
。我想因为数字太大而无法存储到int
中,所以我尝试解析为Long
但导致同样的错误。
我所做的是将数字读作String
,然后创建一个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);
}
}
}
答案 0 :(得分:11)
3827367453723784675745843783623672348745389734268374687也太长了。使用BigInteger
,它允许任意大整数。
答案 1 :(得分:4)
您可以尝试使用BigInteger,因为BigIntegers的范围允许您存储这个大号,因为1682761482512674172712635416571265716235471625176235741
和3827367453723784675745843783623672348745389734268374687
数字太大而且它们超出了整数范围
尝试BigInteger(String val)构造函数
将BigInteger的十进制字符串表示形式转换为 BigInteger的。 String表示由可选的减号组成 符号后跟一个或多个十进制数字的序列。该 字符到数字的映射由Character.digit提供。字符串 可能不包含任何无关的字符(例如,空格)。