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?


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


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.


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) ...


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".



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.


3

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

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

sebagai contoh :

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

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;
        }
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.