我正在尝试将一个非常大的输入读取为String,然后将其转换为long
,如下所示:[该程序适用于短输入]
输入是由空格分隔的两个int
,例如:"1248614876148768372675689568324619856329856295619253291561358926935829358293587932857923857934572895729511 413241"
我的代码:
import java.io.*;
import java.math.*;
import java.util.*;
public class Solution {
public static void main(String args[] ) throws Exception {
Solution obj = new Solution();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
String input[]=new String[T];
for (int i=0;i<T;i++) {
input[i] = br.readLine();
}
for (int i=0;i<T;i++){
StringTokenizer st = new StringTokenizer(input[i]," ");
BigInteger N = new BigInteger(st.nextToken());
BigInteger P = new BigInteger(st.nextToken());
System.out.println(obj.result(N,P));
}
}
}
public BigInteger result(BigInteger N, BigInteger P){
BigInteger temp=1;
BigInteger c=0;
for (BigInteger i=0;i<=N;i++){
//System.out.println(nck(N,i));
if ((nck(N,i)%P) ==0)
c++;
}
return c;
}
public BigInteger nck(BigInteger N, BigInteger k){
if (k==0)
return 1;
else {
BigInteger temp=1;
BigInteger y=1;
BigInteger z=N;
while(k>=1){
temp=temp*z/y;
y++;
z--;
k--;
}
return temp;
}
}
}
我收到了java.lang.NumberFormatException
答案 0 :(得分:5)
您无法将此字符串解析为长字符,它太棒了(大于Long.MAX_VALUE),您需要BigInteger:
BigInteger bi = new BigInteger(st.nextToken());
关注您的修改:
不要尝试迭代一个bigInteger:如果它太长而不适合长时间,那么循环对你来说太长了。将它与合理的限制进行比较,如果它更小,则将其设为int并输入循环:
BigInteger MAX = new BigInteger("1000000");
if (bi.compareTo(MAX)<0) {
int N = bi.intValue();
for (int i=0; i<N; i++) {
Test...
}
}
答案 1 :(得分:3)
如果由于NumberFormatException
大于248614876148768372675689568324619856329856295619253291561358926935829358293587932857923857934572895729511
(Long.MAX_VALUE
)而引发9223372036854775807
。
答案 2 :(得分:0)
该值太大而long
无法容纳。 Primitive Data Types
我想知道你要用这么大的整数做什么,但你可能要找的是BigInteger
。
不可变的任意精度整数。所有操作都表现得好像BigIntegers用二进制补码表示法表示(如Java的原始整数类型)。 BigInteger为所有Java的原始整数运算符以及java.lang.Math中的所有相关方法提供类似物。此外,BigInteger还提供模块化算术,GCD计算,素性测试,素数生成,位操作以及其他一些其他操作的操作。
它提供了数学运算的方法。还应注意,由于它是不可变的,因此您在BigInteger
上执行的任何操作都会返回新的BigInteger
。
答案 3 :(得分:0)
正如其他人所指出的,valuse对于long
来说太大了。但是另一个问题是字符串中没有空格被转换。从字符串here
“(可选)负号和/或基数说明符(”0x“,”0X“,”#“或前导零)之后的字符序列由Long.parseLong方法解析,并带有指示的基数(10,16或8)。这个字符序列必须表示正值或抛出NumberFormatException。如果指定String的第一个字符是减号,结果将被否定。不允许使用空白字符字符串。“来自Docs
答案 4 :(得分:0)
请记住,当从int类型更改为BigInteger时,您将处理对象而不是基元。 BigInteger(String val)可能是最有用的构造函数。
(即)BigInteger temp = new BigInteger("1");