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?
Jawaban:
600851475143
tidak dapat direpresentasikan sebagai integer 32-bit (tipeint
). Ini dapat direpresentasikan sebagai integer 64-bit (tipelong
). literal panjang di Java diakhiri dengan "L":600851475143L
sumber
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
L
untuk nilai yang panjang.sumber
long
, baca ini: stackoverflow.com/a/8924925/293280Anda perlu menggunakan literal panjang:
obj.function(600851475143l); // note the "l" at the end
Tapi saya berharap fungsi itu kehabisan memori (atau waktu) ...
sumber
l
huruf besar, sehingga mudah dibedakan dari1
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
l
atauL
setelahnya. Nomor Anda akan terlihat seperti ini600851475143L
.Karena beberapa Font menyulitkan untuk membedakan "1" dan huruf kecil "l" satu sama lain, Anda harus selalu menggunakan huruf besar "L".
sumber
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).sumber
Pada waktu kompilasi nomor "600851475143" direpresentasikan dalam bilangan bulat 32-bit, coba literal panjang sebagai gantinya di akhir nomor Anda untuk mengatasi masalah ini.
sumber
Terlepas dari semua jawaban lainnya, yang dapat Anda lakukan adalah:
long l = Long.parseLong("600851475143");
sebagai contoh :
obj.function(Long.parseLong("600851475143"));
sumber
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; } } }
sumber