600851475143の「整数が大きすぎます」というエラーメッセージ


89
public class Three {
    public static void main(String[] args) {
        Three obj = new Three();
        obj.function(600851475143);
    }

    private Long function(long  i) {
        Stack<Long> stack = new Stack<Long>();

        for (long j = 2; j <= i; j++) {
            if (i % j == 0) {
                stack.push(j);
            }
        }
        return stack.pop();
    }
}

上記のコードを実行すると、行にエラーが発生しobj.function(600851475143);ます。どうして?


1
また、「l」と「L」の間に違いはありませんか?
user446654 2010

@ user446654:いいえ、あります。後者の方が読みやすいです。これについては「Javaパズル」を読んでください。
Adeel Ansari 2010

@ user446654:進化する@Thiloは、2コインを追加したいので、メモリ制限を超える可能性があると考えています。例のように大きな数で操作する場合は、数のすべての除算器を検索するための非常に悪いアルゴリズムを選択しました。おそらく動的計画法に基づくものの方がうまくいくでしょう。さらなる結果のためにそれについてグーグル。
ローマ

1
PEタグ、Project Euler#3
st0le 2010

@ st0le:私見では、質問は間違いなく元の問題の解決策ではなく、私たちが見ているものも解決策ではありません。
ローマ

回答:


200

60085147514332ビット整数(type int)として表すことはできません。64ビット整数(type long)として表すことができます。Javaの長いリテラルは「L」で終わります。600851475143L


71

接尾辞を追加しますL23423429L

デフォルトでは、Javaはすべての数値リテラルを32ビット整数値として解釈します。これが32ビット整数よりも大きいものであることを明示的に指定する場合はL、長い値にサフィックスを使用する必要があります。


変数の型をに変更した後でもこのエラーメッセージが表示される理由の詳細な説明をお探しの方は、stackoverflow.comlong
JoshuaPinter19年

29

長いリテラルを使用する必要があります。

obj.function(600851475143l);  // note the "l" at the end

しかし、私はその関数がメモリ(または時間)を使い果たすことを期待します...


17
l大文字を使用することをお1
勧めし

2
@Bozho:同意しました。しかし、私はPerlのバックグラウンドを持っています。私は「書き込み専用」をコーディングします:
Thilo 2010

「l」の代わりに「L」を使用する
Kevin V

13

Javaコンパイラは、デフォルトで600851475143をint型の定数値として解釈しようとします。600851475143はintで表すことができないため、これによりエラーが発生します。

数値インタープリターが長いものであることをコンパイラーに伝えるには、そのいずれかlまたはL後に追加する必要があります。その場合、番号は次のようになります600851475143L

一部のフォントでは「1」と小文字の「l」を区別するのが難しいため、常に大文字の「L」を使用する必要があります。


6

整数リテラル600851475143を表すには40ビットが必要です。Javaでは、最大整数値は2 ^ 31-1です(つまり、整数は32ビットです。http: //download.oracle.com/javase/1.4.2/docsを参照してください)。/api/java/lang/Integer.html)。

これはとは何の関係もありませんfunction。代わりに長整数リテラルを使用してみてください(他の回答で提案されているように)。


4

コンパイル時に、数値「600851475143」は32ビット整数で表されます。この問題を解決するには、数値の末尾で代わりに長いリテラルを試してください。


3

他のすべての答えとは別に、あなたができることは:

long l = Long.parseLong("600851475143");

例えば ​​:

obj.function(Long.parseLong("600851475143"));

1

または、入力番号をlongとして宣言してから、コードtango:D ..を実行させることもできます。

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    System.out.println("Enter a number");
    long n = in.nextLong();

    for (long i = 2; i <= n; i++) {
        while (n % i == 0) {
            System.out.print(", " + i);
            n /= i;
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.