1

我正在尝试将一个非常大的输入读取为字符串,然后将其转换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

4

5 回答 5

6

你不能把这个字符串解析成一个长字符串,它太大了(大于Long.MAX_VALUE),你需要BigInteger

BigInteger bi = new BigInteger(st.nextToken());

在您的编辑之后:

不要尝试迭代 bigInteger :如果它太大而无法放入 long 中,那么循环对于您的时间来说太长了。将其与合理的限制进行比较,如果它更小,则将其作为 int 获取并进入您的循环:

    BigInteger MAX = new BigInteger("1000000");
    if (bi.compareTo(MAX)<0) {
        int N = bi.intValue();
        for (int i=0; i<N; i++) {
            Test...
        }
    }
于 2012-09-28T16:15:01.717 回答
3

如果抛出NumberFormatException因为248614876148768372675689568324619856329856295619253291561358926935829358293587932857923857934572895729511大于Long.MAX_VALUE(即9223372036854775807)。

于 2012-09-28T16:14:59.197 回答
0

值太大,long无法保存。原始数据类型

我想知道你想用这么大的整数做什么,但你可能正在寻找的是一个BigInteger.

不可变的任意精度整数。所有操作的行为都好像 BigIntegers 以二进制补码表示法表示(如 Java 的原始整数类型)。BigInteger 提供了与 Java 的所有原始整数运算符的类似物,以及 java.lang.Math 中的所有相关方法。此外,BigInteger 还提供模算术、GCD 计算、素数测试、素数生成、位操作和一些其他杂项操作的操作。

它提供了数学运算的方法。还应该注意,由于它是不可变的,因此您对 a 执行的任何操作都会BigInteger返回一个新的BigInteger.

于 2012-09-28T16:17:25.203 回答
0

正如其他人指出的那样,值太大了,long但是另一个问题是正在转换的字符串中不能有空格。有一篇关于从字符串中删除空格的文章here

“在(可选)负号和/或基数说明符(“0x”、“0X”、“#”或前导零)之后的字符序列被 Long.parseLong 方法解析为具有指示的基数(10, 16 或 8)。此字符序列必须表示正值,否则将引发 NumberFormatException。如果指定 String 的第一个字符是减号,则结果为否定。String中不允许有空白字符。" 从文档

于 2012-09-28T16:19:17.953 回答
0

请记住,当从 int 类型更改为 BigInteger 时,您处理的是对象而不是原始类型。BigInteger (String val) 可能是最有用的构造函数。

(IE)BigInteger temp = new BigInteger("1");

于 2012-09-28T16:54:00.960 回答