当前位置: 首页 > 面试题库 >

解析大量数字时出现NumberFormatException?

萧胜
2023-03-14
问题内容

我知道这可能不是最有效的编码方式,但这是我到目前为止所掌握的方法,并且在数字变得很大之前一直有效。该代码应从文件中读取2个数字,例如“ 052”和“
61”。然后,它应该按从大到小的顺序对第一个数字进行排序,以使该数字尽可能大,而从最小到大个数的第二个数字,则使其尽可能小。(520&16)然后打印两者的差值,在这种情况下为504。

其中两个数字是“ 3827367453723784675745843783623672348745389734268374687”和“
1682761482512674172712635416571265716235471625176235741”。从最大到最小,从最小到最大,对数字进行排序可以正常工作,但是当我尝试将其解析为整数时,NumberFormatException会引发a。我认为是因为该数字太大而无法存储到一个中,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);
    }
    }    
}

问题答案:

3827367453723784675745843783623672348745389734268374687也太长了。使用BigInteger,它允许任意大整数。



 类似资料:
  • 问题内容: 因此,我正在制作可以访问给定文件并从中保存/读取文件的文件读取器/写入器。从文件读取时遇到问题。内容是整数,字符串和由“ |”分隔的双精度 定界符。我正在使用StringTokenizer来分隔标记并将它们保存到每个单独的变量中,但是当我读取整数时,即使字符串仅包含一个整数,我也会得到NumberFormatException。 这是代码: 该文件的示例行: 和错误: 我在这里想念什么

  • 问题内容: 我已经在C中实现了一些排序算法(用于对整数进行排序),并谨慎地用于存储与数据大小有关的任何内容(因此还包括了计数器和填充物),因为该算法也应使用数千兆字节的数据集进行测试整数 这些算法应该很好,并且分配的数据量应该没有问题:数据存储在文件中,并且每次仅加载很少的块,即使将内存中的缓冲区阻塞为任意大小,也可以正常工作。 使用数据集最多4千兆字节(因此16GB数据)的测试可以正常工作(排序

  • 问题内容: 我正在以JSON格式传回来自网络服务器的批准推文列表。当我转到URL:时,在我的浏览器中得到以下JSON: 其ID为:。 当我从Javascript进行GET调用时,数字发生变化: 此代码提醒: 354210796420608004!= 354210796420608000 很奇怪。 问题答案: 不,不是很奇怪。JS将所有数字表示为双精度数字,并且随着整数的增大,您有时会失去精度。 要

  • 我有一个代表学生实体的字符串: 学生实体类是: 对于解析字符串,我使用以下代码: 响应1是一个httpresponse的主体,它代表我来自描述的字符串。 例外情况:

  • 问题内容: 我正在用Python阅读JSON文件,其中包含许多字段和值(约8000条记录)。Env:Windows 10,Python 3.6.4;码: 这样我得到一个错误。下面是堆栈跟踪: 伴随着我,我尝试了 与此相关,我的程序运行了很长时间,然后挂起,没有任何输出。 我搜索了几乎与此相关的所有主题,但找不到解决方案。 注意:JSON数据是有效的,因为当我在Postman /任何REST客户端上

  • 问题内容: 具有创建仅时间Date对象的函数。(为什么需要这样做是一个长话短说,在这种情况下是无关紧要的,但是我需要与XML世界中的一些东西进行比较,其中TIME(即仅时间)是一个有效的概念)。 可能至少还有其他几种方法可以在Java中创建只有时间的日期(或更确切地说,日期部分为1970-01-01的日期),但是我的问题实际上不是关于此的。 我的问题是,这段代码在生产中运行了很长时间之后,开始在第