عند حساب العوامل التي تتجاوز 20 أو أكثر ، تميل قيمة النتيجة للعاملين إلى أن تكون كبيرة جدًا. قد تتجاوز النتيجة العليا لعدد صغير جدًا نطاق الأعداد الصحيحة في الكمبيوتر الشخصي الحالي. إذا كنت بحاجة إلى عامل كبير ، على سبيل المثال ، لا يمكن حل أعلى من 1000 بطريقة بسيطة متكررة. على الإنترنت ، رأيت العديد من الخوارزميات حول عوامل الصدفة الكبيرة المكتوبة في C و C ++ و C#، بما في ذلك العديد من المقالات الكلاسيكية ولكن أيضًا العديد من المقالات الخشنة. يعبر المصفوفة الحدود ويمكنك أن ترى في لمحة أنه لا يمكن للبرنامج نفسه تشغيله. عند إعادة طباعة مقالات الآخرين ، ألق نظرة فاحصة على الكود. للأسف ، خشنة. إنها السنة الصينية الجديدة ، أشعر بالتعب الشديد في المنزل. لقد قمت بتحليل Java واستخدمته بعناية لتنفيذ برنامج لحساب Foot-Large Integer Factorial. يتم أخذ الفكرة من الإنترنت ويتم تحسينها وتحسينها شخصيًا.
تستخدم هذه الطريقة خوارزمية "صفيف حمل". عندما يتم تجاوز نطاق قيمة متغيرات الكمبيوتر ، يتم تحويل الضرب متعدد الأرقام إلى مضاعفة أحادية الرقبة. مثل 11! = 39916800. إذا كنت بحاجة إلى عامل في 12 ، فأنت بحاجة إلى ضرب 39916800 و 12 ، ويمكنك استخدام معدل تخصيص الضرب. يوضح الشكل أدناه الصيغة العمودية للضرب:
استخدم صفيفًا لحفظ نتيجة كل جزء من العامل ، وعنصر صفيف لحفظ الرقم المكون من رقم واحد. على سبيل المثال: 399 من النتيجة العليا لـ 11
يتم حفظ 16800 إلى 8 عناصر الصفيف. لحساب العازف 12 ، اضرب القيمة في كل عنصر صفيف بمقدار 12 ، وحفظ النتيجة إلى عنصر الصفيف الأصلي. بعد ذلك ، سنحدد ما إذا كان كل عنصر صفيف يحتاج إلى حمله. من خلال عمليات الحمل ، يكون الرقم الذي تم حفظه بواسطة كل عنصر في المصفوفة فقط من رقم واحد. الرسم التخطيطي هو كما يلي:
من الناحية النظرية ، طالما تسمح مساحة ذاكرة الكمبيوتر ، يمكن حفظ النتيجة العليا ، ولم تعد محدودة من خلال نطاق المتغيرات ، ولكنها محدودة فقط بقدرة نظام التشغيل وذاكرة الكمبيوتر. نصائح ودية: إذا كان الرقم العامل المطلوب كبيرًا ، فيمكنك تحديد المصفوفة كنوع طويل لتجنب التدفق عند حساب منتج رقم الوحدة.
رمز التنفيذ كما يلي:
الفئة العامة BigInteger {/*** حساب Carry* param bit array* param pos المستخدمة لتحديد ما إذا كان أعلى جزء من الصفيف*/private void carry (int [] bit ، int pos) {int i ، carray = 0 ؛ for (i = 0 ؛ i <= pos ؛ <= 9) // لا يوجد حمل إذا كان أقل من 9 {carray = 0 ؛} آخر إذا (bit [i]> 9 && i <pos) // أكبر من 9 ، ولكن ليس أعلى بت {carray = bit [i]/10 ؛ بت {بينما (bit [i]> 9) // loop إلى الأمام بت {carray = bit [i]/10 ؛ // حساب قيمة الحمل بت [i] = bit [i] ٪ 10 ؛ // الرقم الأول الحالي i ++ ؛ bit [i] = carray ؛ void bigfactorial (int biginteger) {int pos = 0 ؛ // int digit ؛ // طول البيانات int a ، b ؛ int m = 0 ؛ (int) sum+ 1 ؛ // طول البيانات int [] fact = new int [digit] ؛ // تهيئة حقيقة صفيف [0] = 1 ؛ // لنفترض أن الرقم الوحيد هو 1For (a = 2 ؛ a <= biginteger ؛ a ++) // multiser 2^biginteger مع المنتج الأصلي واحد {b = b = b> b> 0 ؛ fact [b]! = 0) {pos = b ؛ // سجل أعلى فاصل بت ؛}} لـ (b = 0 ؛ b <= pos ؛ b ++) {fact [b] *= a ؛ // كلت مضاعفة بواسطة i} carry (post ، pos) ؛} لـ (b = digit-1 ؛ b> b> b-) break ؛}} system.out.println (biginteger+"نتيجة المصنع هي:") ؛ لـ (a = pos ؛ a> a> a -) ؛ n ++ ؛ if (10 == n) {system.out.print ("/n") ؛ n = 0 ؛}}} system.out.println ("/n"+"have: this.bigfactorial (biginteger) ؛ int timfinishi = (int) system.currentTimeMillis () ؛ int time = timefinishi-timebegin ؛ system.out.println ("وقت الحساب:" + time + "MSEC") ؛ BigInteger () ؛ Bi.DobigFactorial (100000) ؛}}احسب العازف من 10000 وعرض ما يلي:
نتيجة لذلك ، من الواضح أن وحدة التحكم لا يمكنها حفظ المحتوى. هناك 450،000 عامل من 100،000 ، وهو ما يعادل رواية مع 450،000 كلمة. النتائج العليا لـ 1000 هي كما يلي:
يمكن عرض وحدة التحكم بالكامل.
لخص
ما سبق هو كل محتوى هذه المقالة حول التفسير التفصيلي لإصدار Java من رمز خوارزمية Super Large Integer Factorial - المستوى 10،000. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى هذا الموقع:
" تحليل رمز التشغيل لقيمة فهرس الطاقة في جافا "
" مثال رمز تنفيذ برمجة Java على الحصرية أو تشغيل السلاسل السداسية السداسية "
" Java Programming تنفيذ تصفية تعاونية تعاونية قائم على المستخدم مثال رمز الخوارزمية" مثال "
إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!