Pesan kesalahan "Bilangan bulat terlalu besar" untuk 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();
    }
}

Ketika kode di atas dijalankan, menghasilkan kesalahan pada saluran obj.function(600851475143);. Mengapa?

pengguna446654
sumber
1
juga tidak ada perbedaan antara "l" dan "L"?
pengguna446654
@ user446654: Tidak, ada. Yang terakhir lebih mudah dibaca. Baca "Java Puzzler" untuk ini.
Adeel Ansari
@ user446654: mengembangkan pemikiran @Thilo tentang kemungkinan batas memori yang melebihi Saya ingin menambahkan 2 koin saya: Anda telah memilih algoritma yang sangat, sangat buruk untuk mencari semua pemisah angka jika Anda ingin beroperasi dengan angka besar seperti dalam contoh Anda. Sesuatu yang didasarkan pada pemrograman dinamis mungkin akan bekerja lebih baik. Google tentang itu untuk hasil lebih lanjut.
Roman
1
Menambahkan tag PE, Project Euler # 3
st0le
@ st0le: IMHO, pertanyaannya adalah deffinitely bukan tentang solusi masalah asli, dan apa yang kita lihat bukanlah solusi juga.
Roman

Jawaban:

200

600851475143tidak dapat direpresentasikan sebagai integer 32-bit (tipe int). Ini dapat direpresentasikan sebagai integer 64-bit (tipe long). literal panjang di Java diakhiri dengan "L":600851475143L

Yuliy
sumber
71

Tambah akhiran L: 23423429L.

Secara default, java menafsirkan semua literal angka sebagai nilai integer 32-bit. Jika Anda ingin secara eksplisit menentukan bahwa ini adalah sesuatu yang lebih besar dari integer 32-bit, Anda harus menggunakan sufiks Luntuk nilai yang panjang.

Roma
sumber
Bagi mereka yang mencari penjelasan yang lebih menyeluruh tentang mengapa Anda mendapatkan pesan kesalahan ini bahkan setelah Anda mengubah tipe variabel menjadi long, baca ini: stackoverflow.com/a/8924925/293280
Joshua Pinter
29

Anda perlu menggunakan literal panjang:

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

Tapi saya berharap fungsi itu kehabisan memori (atau waktu) ...

Thilo
sumber
17
menganggap praktik yang lebih baik untuk membuat lhuruf besar, sehingga mudah dibedakan dari1
Bozho
2
@ Bozho: Setuju. Tapi saya memiliki latar belakang Perl. Saya memberi kode "hanya-tulis" :-)
Thilo
Gunakan "L" bukan "l"
Kevin V
13

Kompilator java mencoba menafsirkan 600851475143 sebagai nilai konstan tipe int secara default. Hal ini menyebabkan kesalahan karena 600851475143 tidak dapat direpresentasikan dengan int.

Untuk memberi tahu kompilator bahwa Anda menginginkan penafsiran angka asalkan Anda harus menambahkan salah satu latau Lsetelahnya. Nomor Anda akan terlihat seperti ini 600851475143L.

Karena beberapa Font menyulitkan untuk membedakan "1" dan huruf kecil "l" satu sama lain, Anda harus selalu menggunakan huruf besar "L".

josefx
sumber
6

Anda membutuhkan 40 bit untuk merepresentasikan integer literal 600851475143. Di Java, nilai integer maksimum adalah 2 ^ 31-1. Namun demikian (bilangan bulat adalah 32 bit, lihat http://download.oracle.com/javase/1.4.2/docs /api/java/lang/Integer.html ).

Ini tidak ada hubungannya dengan function. Coba gunakan literal integer panjang sebagai gantinya (seperti yang disarankan dalam jawaban lain).

Andre Holzner
sumber
4

Pada waktu kompilasi nomor "600851475143" direpresentasikan dalam bilangan bulat 32-bit, coba literal panjang sebagai gantinya di akhir nomor Anda untuk mengatasi masalah ini.

JVM
sumber
3

Terlepas dari semua jawaban lainnya, yang dapat Anda lakukan adalah:

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

sebagai contoh :

obj.function(Long.parseLong("600851475143"));
Anand Undavia
sumber
1

Atau, Anda dapat mendeklarasikan nomor masukan selama, dan kemudian membiarkannya melakukan kode 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;
        }
    }
}
Milen. Jeremik
sumber