การคัดลอกรหัสมีดังนี้:
นำเข้า java.io.bufferedreader;
นำเข้า java.io.ioException;
นำเข้า Java.io.InputStreamReader;
นำเข้า java.util.regex.matcher;
นำเข้า java.util.regex.pattern;
-
* การใช้งานการคูณจำนวนมากอย่างง่ายยังไม่สมบูรณ์แบบมากนัก
* แก้ไข:
* 1. ข้อผิดพลาดบางอย่างของการลบ 0 ก่อนและหลังการแก้ไข
* 2. สนับสนุนการทำงานจำนวนลบ
* 3. เพื่อตรวจสอบว่าสตริงอินพุตเป็นไปตามคำจำกัดความของทศนิยมให้ใช้นิพจน์ทั่วไปเพื่อตัดสิน
* @author Icejoywoo
* @Since 2012.2.16
* @version 0.1.1
-
Bignumber ชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะหลัก (String [] args) พ่น IOException {
System.out.println ("อินพุตสองจำนวนเต็มขนาดใหญ่:");
bufferedReader buffer = bufferedReader ใหม่ (ใหม่ inputStreamReader (system.in));
สตริง [] strarray = buffer.readline (). แยก ("//*");
System.out.println (Bignumbermultiply (Strarray [0], Strarray [1]));
-
-
* คำนวณผลิตภัณฑ์ของสองจำนวนและความแม่นยำใด ๆ
* @param พารามิเตอร์แรกแรก
* @param พารามิเตอร์ที่สองที่สอง
* @return คูณสองตัวเลข
-
สตริงคงที่ส่วนตัว bignumbermultiply (สตริงแรก, สตริงที่สอง) {
// สัญญาณของสัญญาณบวกและลบ
ธงบูลีน = เท็จ;
if (first.charat (0) == '-') {
ธง =! ธง;
first = first.substring (1);
-
if (second.charat (0) == '-') {
ธง =! ธง;
second = second.substring (1);
-
// ตำแหน่งของจุดทศนิยม
int apoints = first.length () - first.indexof ('.') - 1;
int bpoints = second.length () - second.indexof ('.') - 1;
int pointpos = apoints + bpoints;
// ลบจุดทศนิยม
StringBuffer abuffer = new StringBuffer (first.replaceall ("//.", "");
StringBuffer bbuffer = new StringBuffer (second.replaceall ("//.", ""));
int [] a = string2intarray (abuffer.toString ());
int [] b = string2intarray (bbuffer.toString ());
int [] result = new int [A.Length + B.Length - 1];
// คำนวณ
สำหรับ (int i = 0; i <a.length; i ++) {
สำหรับ (int j = 0; j <b.length; j ++) {
ผลลัพธ์ [i + j] + = a [i] * b [j];
-
-
// ถ้าหนึ่งในผลลัพธ์มากกว่า 9 จะต้องดำเนินการ
สำหรับ (int i = result.length -1; i> = 0; --i) {
ถ้า (ผลลัพธ์ [i]> 9) {
ผลลัพธ์ [i - 1] += ผลลัพธ์ [i] / 10;
ผลลัพธ์ [i] = ผลลัพธ์ [i] % 10;
-
-
StringBuffer buffer = new StringBuffer ();
สำหรับ (int i = 0; i <result.length; ++ i) {
// เพิ่มจุดทศนิยม
if (result.length - i == pointpos) {
buffer.append (".");
-
buffer.append (string.valueof (ผลลัพธ์ [i]));
-
if (buffer.indexof (".")! = -1)
-
// ลบ 0 ครั้งแรก
int i = 0;
ในขณะที่ (i <buffer.length ()) {
if (buffer.length ()> 2 && buffer.charat (i+1) == '.') {// มีเพียงหนึ่งหมายเลข 0 ก่อนจุดทศนิยม
หยุดพัก;
} อื่นถ้า (buffer.charat (i) == '0') {// ลบ 0 แรก
buffer.deletecharat (i);
i = 0;
ดำเนินการต่อ;
} else {// เมื่อตำแหน่งแรกไม่ใช่ 0
หยุดพัก;
-
-
// ลบปลาย 0
i = buffer.length () - 1;
ในขณะที่ (i> = 0) {
if (buffer.length ()> 2 && buffer.charat (i-1) == '.') {// จุดทศนิยมคือตัวเลขโดยตรง
หยุดพัก;
} อื่นถ้า (buffer.charat (i) == '0') {// ลบ 0 ในตอนท้าย
buffer.deletecharat (i);
i = buffer.length () - 1;
ดำเนินการต่อ;
} else {// เมื่อบิตสุดท้ายไม่ใช่ 0
หยุดพัก;
-
-
-
// ตามบิตสัญญาณค่าสถานะบวกและลบของค่าผลตอบแทน
ถ้า (ธง) {
return "-" + buffer.toString ();
} อื่น {
return buffer.toString ();
-
-
-
* แทนที่สตริงเป็นอาร์เรย์
* @param หมายเลข
* @กลับ
-
INT แบบคงที่ส่วนตัว [] String2IntArray (หมายเลขสตริง) {
// พิจารณาว่าอินพุตตรงตามข้อกำหนดของหมายเลขจุดลอยตัว
รูปแบบรูปแบบ = pattern.compile ("^(-? // d+| // d*) //.?// d*$");
matcher matcher = pattern.matcher (หมายเลข);
if (! matcher.find ()) {
โยน unlegalargumentException ใหม่ ("หมายเลขอินพุตไม่ถูกต้อง!");
-
int [] result = new int [number.length ()];
สำหรับ (int i = 0; i <number.length (); i ++) {
ผลลัพธ์ [i] = (int) (number.charat (i) - '0');
-
ผลการกลับมา;
-
-
ผลการดำเนินการมีดังนี้:
1. คำพิพากษาของอินพุตที่ไม่ถูกต้อง
การคัดลอกรหัสมีดังนี้:
อินพุตจำนวนเต็มขนาดใหญ่สองตัว:
1a*a22
ข้อยกเว้นในเธรด "หลัก" java.lang.illegalargumentException: หมายเลขอินพุตไม่ถูกต้อง!
ที่ bignumber.string2intarray (bignumber.java:132)
ที่ bignumber.bignumbermultiply (bignumber.java:54)
ที่ bignumber.main (bignumber.java:22)
2. การทำงานที่มีตัวเลขติดลบโดย 0 ก่อนและหลัง
การคัดลอกรหัสมีดังนี้:
อินพุตจำนวนเต็มขนาดใหญ่สองตัว:
-23424.2300*02345.234000000
-54935300.61982
ผลการคำนวณใน Python มีดังนี้
การคัดลอกรหัสมีดังนี้:
Python 2.6.5
>>> -23424.2300*02345.23400000
-54935300.619819999
จะเห็นได้ว่าผลลัพธ์ของงูหลามบิดเบี้ยว