نسخة الكود كما يلي:
استيراد 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 {
الفراغ الثابت العام (سلسلة [] args) يلقي ioexception {
System.out.println ("إدخال اثنين من الأعداد الصحيحة الكبيرة:") ؛
BufferedReader Buffer = جديد BufferEdReader (New InputStreamReader (System.in)) ؛
String [] strarray = buffer.readline (). split ("//*") ؛
System.out.println (bignumbermultiply (strarray [0] ، strarray [1])) ؛
}
/**
* احسب منتج رقمين من أي حجم ودقة
* param المعلمة الأولى الأولى
* param المعلمة الثانية الثانية
* @العودة تضاعف من رقمين
*/
سلسلة ثابتة خاصة bignumbermultiply (سلسلة أولاً ، السلسلة الثانية) {
// علامة على علامة إيجابية وسلبية
العلم المنطقي = خطأ ؛
if (first.charat (0) == '-') {
العلم =! العلم ؛
أولاً = first.SubString (1) ؛
}
if (second.charat (0) == '-') {
العلم =! العلم ؛
الثانية = 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 [] النتيجة = int new [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) ؛
أنا = 0 ؛
يكمل؛
} آخر {// عندما لا يكون الموضع الأول 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 ؛
يكمل؛
} آخر {// عندما لا يكون البت الأخير 0
استراحة؛
}
}
}
// وفقًا لبت الإشارة ، فإن الأعلام الإيجابية والسلبية لقيمة الإرجاع
إذا (العلم) {
إرجاع "-" + buffer.toString () ؛
} آخر {
إرجاع buffer.toString () ؛
}
}
/**
* استبدل السلسلة في صفيف
* رقم param
* @يعود
*/
int static int [] string2intarray (رقم السلسلة) {
// تحديد ما إذا كان المدخلات تلبي متطلبات أرقام النقاط العائمة
نمط نمط = pattern.compile ("^(-؟ // d+| // d*) //.؟// d*$") ؛
matcher matcher = pattern.matcher (number) ؛
if (! matcher.find ()) {
رمي جديد غير unalfalArgumentException ("رقم الإدخال غير صحيح!") ؛
}
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
يؤدي الحساب إلى الثعبان على النحو التالي
نسخة الكود كما يلي:
بيثون 2.6.5
>>> -23424.2300*02345.23400000
-54935300.619819999
يمكن ملاحظة أن نتائج الثعبان مشوهة