Java中存储超大数字「58176849671553176833344572581」应使用哪种数据类型?
在Java中存储超大整数的解决方案
你提到的数字「58176849671553176833344572581」有29位,远超过long类型的最大值(9223372036854775807,仅19位),无法用long存储;而float/double作为浮点类型,采用科学计数法存储整数时会丢失精度,同样无法准确表示这类超大整数。
正确的存储类型:java.math.BigInteger
Java标准库中的BigInteger类专门用于表示任意精度的整数,它没有固定的位数限制,能准确存储和运算任何大小的整数,完全适配你遇到的超大数字场景。
适配你的代码修改示例
原代码使用sc.nextLong()读取超大数字会直接抛出溢出异常,同时字符串拼接效率较低。以下是修改后的代码,结合BigInteger实现需求:
package uri; import java.util.*; import java.math.BigInteger; public class Clutter { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); // 直接读取数字字符串,避免long类型溢出 String bStr = sc.next(); while (a != 0 && !bStr.equals("0")) { StringBuilder resultBuilder = new StringBuilder(); for (char c : bStr.toCharArray()) { int digit = Character.getNumericValue(c); if (digit == a) { // 处理删除所有字符后的边界情况 if (resultBuilder.length() == 0 && bStr.length() == 1) { System.out.println(0); return; } continue; } resultBuilder.append(c); } // 输出结果:空字符串则输出0,否则转BigInteger输出 if (resultBuilder.length() == 0) { System.out.println(0); } else { BigInteger result = new BigInteger(resultBuilder.toString()); System.out.println(result); } a = sc.nextInt(); bStr = sc.next(); } } }
关键修改说明
- 用
sc.next()读取超大数字的字符串形式,绕过基本类型的容量限制 - 改用
StringBuilder拼接字符,比直接使用String的+操作更高效 - 处理完成后通过
BigInteger转换字符串,保证输出数值的准确性 - 补充了删除所有字符时输出0的边界逻辑,避免转换异常
内容的提问来源于stack exchange,提问作者Codered
相关产品推荐
相关产品推荐

