1

非常に大きな入力をStringとして読み取り、それを次のように変換しようとしてlongいます。[プログラムは短い入力で動作します]

入力はintスペースで区切られた2つです。例:"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に解析することはできません。大きすぎます( 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...
        }
    }
于 2012-09-28T16:15:01.717 に答える
3

が(である)より大きいNumberFormatExceptionためにスローされた場合。248614876148768372675689568324619856329856295619253291561358926935829358293587932857923857934572895729511Long.MAX_VALUE9223372036854775807

于 2012-09-28T16:14:59.197 に答える
0

値が大きすぎlongて保持できません。プリミティブデータ型

あなたがこんなに大きな整数で何をしようとしているのだろうかと思いますが、あなたが探しているのはBigIntegerです。

不変の任意精度の整数。すべての操作は、BigIntegerが2の補数表記で表されているかのように動作します(Javaのプリミティブ整数型のように)。BigIntegerは、Javaのすべてのプリミティブ整数演算子、およびjava.lang.Mathのすべての関連メソッドに類似したものを提供します。さらに、BigIntegerは、モジュラー演算、GCD計算、素数性テスト、素数生成、ビット操作、およびその他のいくつかの操作のための操作を提供します。

数学演算のメソッドを提供します。また、不変であるため、returnsで実行する操作はすべてBigInteger新しいを返すことに注意してくださいBigInteger

于 2012-09-28T16:17:25.203 に答える
0

int型からBigIntegerに変更するときは、プリミティブではなくオブジェクトを処理していることに注意してください。BigInteger(String val)は、おそらく最も有用なコンストラクターです。

(すなわち)BigInteger temp = new BigInteger("1");

于 2012-09-28T16:54:00.960 に答える
0

他の人が指摘したように、値が大きすぎます。longただし、別の問題は、変換中の文字列にスペースを含めることができないことです。ここに文字列から空白を削除する便利な投稿があります

「(オプションの)負符号および/または基数指定子(「0x」、「0X」、「#」、または先行ゼロ)に続く文字列は、指定された基数(10、 16、または 8)。この一連の文字は正の値を表す必要があります。そうしないと、NumberFormatException がスローされます。指定された String の最初の文字がマイナス記号の場合、結果は否定されます。String では空白文字は許可されません。" ドキュメントから

于 2012-09-28T16:19:17.953 に答える