Salinan kode adalah sebagai berikut:
impor java.io.bufferedReader;
impor java.io.ioException;
impor java.io.inputStreamReader;
impor java.util.regex.matcher;
impor java.util.regex.pattern;
/**
* Implementasi sederhana dari multiplikasi angka besar belum terlalu sempurna
* Memperbaiki:
* 1. Beberapa kesalahan menghapus 0 sebelum dan sesudah modifikasi
* 2. Dukung operasi angka negatif
* 3. Untuk menentukan apakah string input memenuhi definisi desimal, gunakan ekspresi reguler untuk menilai
* @Author Icejoywoo
* @since 2012.2.16
* @Version 0.1.1
*/
Bignumber kelas publik {
public static void main (string [] args) melempar ioException {
System.out.println ("Masukkan dua bilangan bulat besar:");
BufferedReader buffer = BufferedReader baru (inputStreamReader baru (System.in));
String [] strarray = buffer.readline (). Split ("//*");
System.out.println (BignumberMultiply (Strarray [0], Strarray [1]));
}
/**
* Hitung produk dari dua jumlah ukuran dan presisi apa pun
* @param parameter pertama
* @param parameter kedua
* @return Multiply dari dua angka
*/
Private Static String BignumberMultiply (String First, String Second) {
// tanda tanda positif dan negatif
bendera boolean = false;
if (first.charat (0) == '-') {
Bendera =! Bendera;
pertama = first.substring (1);
}
if (detik.charat (0) == '-') {
Bendera =! Bendera;
kedua = kedua.substring (1);
}
// Posisi titik desimal
int apoints = first.length () - first.indexof ('.') - 1;
int bpoints = Second.length () - Second.Indexof ('.') - 1;
int pointpos = Apoints + bpoints; // posisi titik desimal hasil
// hapus titik desimal
StringBuffer abuffer = New StringBuffer (first.replaceall ("//.", ""));
StringBuffer BBuffer = New StringBuffer (Second.ReplaceAll ("//.", ""));
int [] a = string2intarray (abuffer.toString ());
int [] b = String2IntArray (bbuffer.toString ());
int [] hasil = int [a.length + b.length - 1];
// Hitung
untuk (int i = 0; i <a.length; i ++) {
untuk (int j = 0; j <b.length; j ++) {
Hasil [i + j] + = a [i] * b [j];
}
}
// Jika yang tertentu dalam hasilnya lebih besar dari 9, itu perlu dibawa.
untuk (int i = result.length -1; i> = 0; --i) {
if (hasil [i]> 9) {
Hasil [i - 1] += hasil [i] / 10;
Hasil [i] = hasil [i] % 10;
}
}
StringBuffer buffer = stringBuffer baru (); // Konversi array ke string
untuk (int i = 0; i <result.length; ++ i) {
// Tambahkan poin desimal
if (result.length - i == pointpos) {
buffer.append (".");
}
buffer.append (string.ValueOf (hasil [i]));
}
if (buffer.indexof (".")! = -1)
{
// hapus 0 pertama
int i = 0;
while (i <buffer.length ()) {
if (buffer.length ()> 2 && buffer.charat (i+1) == '.') {// Hanya ada satu angka 0 sebelum titik desimal.
merusak;
} else if (buffer.charat (i) == '0') {// hapus 0 pertama
buffer.deletecharat (i);
i = 0;
melanjutkan;
} else {// Saat posisi pertama bukan 0
merusak;
}
}
// hapus akhir 0
i = buffer.length () - 1;
while (i> = 0) {
if (buffer.length ()> 2 && buffer.charat (i-1) == '.') {// titik desimal secara langsung angka
merusak;
} lain jika (buffer.charat (i) == '0') {// hapus 0 di akhir
buffer.deletecharat (i);
i = buffer.length () - 1;
melanjutkan;
} else {// Saat bit terakhir bukan 0
merusak;
}
}
}
// Menurut bit tanda, bendera positif dan negatif dari nilai pengembalian
if (flag) {
return "-" + buffer.toString ();
} kalau tidak {
return buffer.toString ();
}
}
/**
* Ganti string ke dalam array
* Nomor @param
* @kembali
*/
private static int [] string2intArray (nomor string) {
// Tentukan apakah input memenuhi persyaratan angka titik mengambang
Pola pola = pola.compile ("^(-? // d+| // d*) //.?// d*$");
Pencocokan pencocokan = pola.matcher (angka);
if (! matcher.find ()) {
Lempar IllegalArgumentException baru ("Nomor input salah!");
}
int [] hasil = int int [number.length ()];
untuk (int i = 0; i <number.length (); i ++) {
hasil [i] = (int) (number.charat (i) - '0');
}
hasil pengembalian;
}
}
Hasil operasi adalah sebagai berikut:
1. Penilaian input yang salah
Salinan kode adalah sebagai berikut:
Masukkan dua bilangan bulat besar:
1a*A22
Pengecualian di Thread "Main" java.lang.illegalargumentException: Nomor input salah!
di bignumber.string2intarray (bignumber.java:132)
di Bignumber.BignumberMultiply (Bignumber.java:54)
di bignumber.main (bignumber.java:22)
2. Operasi dengan angka negatif, dengan 0 sebelum dan sesudah
Salinan kode adalah sebagai berikut:
Masukkan dua bilangan bulat besar:
-23424.2300*02345.234000000
-54935300.61982
Hasil perhitungan dalam python adalah sebagai berikut
Salinan kode adalah sebagai berikut:
Python 2.6.5
>>> -23424.2300*02345.23400000
-54935300.619819999
Dapat dilihat bahwa hasil ular python terdistorsi