เมื่อคำนวณแฟคทอเรียลเกิน 20 หรือมากกว่าค่าผลลัพธ์ของแฟคทอเรียลมีแนวโน้มที่จะมีขนาดใหญ่มาก ผลลัพธ์แฟคทอเรียลของจำนวนน้อยมากอาจเกินช่วงของจำนวนเต็มในคอมพิวเตอร์ส่วนบุคคลปัจจุบัน หากคุณต้องการแฟคทอเรียลขนาดใหญ่เช่นสูงกว่า 1,000 ไม่สามารถแก้ไขได้ในวิธีที่เรียกซ้ำได้ง่าย บนอินเทอร์เน็ตฉันได้เห็นอัลกอริทึมมากมายเกี่ยวกับแฟคทอเรียลจำนวนเต็มขนาดใหญ่ที่เขียนใน C, C ++ และ C#รวมถึงบทความคลาสสิกมากมาย แต่ยังมีบทความคร่าวๆมากมาย อาร์เรย์ข้ามขอบเขตและคุณสามารถเห็นได้อย่างรวดเร็วว่าโปรแกรมไม่สามารถเรียกใช้ได้ เมื่อพิมพ์บทความของคนอื่นให้ดูรหัสอย่างใกล้ชิด อนิจจาหยาบ เป็นวันตรุษจีนฉันรู้สึกเหนื่อยมากที่บ้าน ฉันวิเคราะห์และใช้ Java อย่างระมัดระวังเพื่อใช้โปรแกรมเพื่อคำนวณแฟคทอเรียลจำนวนเต็มขนาดใหญ่ที่ใหญ่มาก แนวคิดนี้นำมาจากอินเทอร์เน็ตและได้รับการปรับปรุงและปรับปรุงโดยฉันเป็นการส่วนตัว
วิธีนี้ใช้อัลกอริทึม "Array Carry" เมื่อช่วงค่าของตัวแปรคอมพิวเตอร์เกินการคูณหลายหลักจะถูกแปลงเป็นการคูณตัวเลขหลักเดียว เช่น 11! = 39916800 หากคุณต้องการแฟคทอเรียล 12 คุณต้องคูณ 39916800 และ 12 และคุณสามารถใช้อัตราการจัดสรรการคูณ สูตรการคูณแนวตั้งจะแสดงในรูปด้านล่าง:
ใช้อาร์เรย์เพื่อบันทึกผลลัพธ์ของแฟคทอเรียลแต่ละบิตและองค์ประกอบอาร์เรย์เพื่อบันทึกหมายเลขหนึ่งหลัก ตัวอย่างเช่น: 399 ของผลการศึกษาจาก 11
16800 ถูกบันทึกไว้ใน 8 องค์ประกอบของอาร์เรย์ ในการคำนวณแฟคทอเรียลของ 12 ให้คูณค่าในแต่ละองค์ประกอบอาร์เรย์ด้วย 12 และบันทึกผลลัพธ์ไปยังองค์ประกอบอาร์เรย์ดั้งเดิม ต่อไปเราจะพิจารณาว่าแต่ละองค์ประกอบอาร์เรย์จะต้องพกพาหรือไม่ ผ่านการดำเนินการพกพาจำนวนที่บันทึกโดยแต่ละองค์ประกอบในอาร์เรย์เป็นเพียงตัวเลขเดียว แผนผังไดอะแกรมมีดังนี้:
ในทางทฤษฎีตราบใดที่พื้นที่หน่วยความจำคอมพิวเตอร์อนุญาตให้บันทึกผลลัพธ์แฟคทอเรียลไม่ จำกัด โดยช่วงของตัวแปรอีกต่อไป แต่ถูก จำกัด โดยความสามารถในการกำหนดที่อยู่ของระบบปฏิบัติการและหน่วยความจำคอมพิวเตอร์ เคล็ดลับที่เป็นมิตร: หากหมายเลขแฟคทอเรียลที่ต้องการมีขนาดใหญ่คุณสามารถกำหนดอาร์เรย์เป็นประเภทยาวเพื่อหลีกเลี่ยงการล้นเมื่อคำนวณผลิตภัณฑ์ของหมายเลขหน่วย
รหัสการใช้งานมีดังนี้:
คลาสสาธารณะ BigInteger {/*** คำนวณพกพา* @param bit array* @param pos ใช้เพื่อตรวจสอบว่ามันเป็นบิตสูงสุดของอาร์เรย์*/โมฆะส่วนตัวพกพา (int [] บิต, int pos) {int i, carray = 0; สำหรับ (i = 0; i <= pos; i ++) // <= 9) // ไม่มีการพกพาถ้าน้อยกว่า 9 {carray = 0;} ถ้า (bit [i]> 9 && i <pos) // มากกว่า 9 แต่ไม่ใช่บิตสูงสุด {carray = บิต [i]/10; // บันทึกค่าพก [i] = บิต [i]%10; บิต {ในขณะที่ (บิต [i]> 9) // ลูปไปข้างหน้าบิต {carray = bit [i]/10; // คำนวณค่าพกพาบิต [i] = บิต [i] % 10; // กระแสแรกที่ฉัน ++; บิต [i] = carray; // บันทึกค่าพกพาในบิตถัดไป}}}}} โมฆะ bigfactorial (int biginteger) {int pos = 0; // int digit; // ความยาวของข้อมูล int a, b; int m = 0; // สถิติเอาท์พุทตัวเลข int n = 0; // สถิติเอาต์พุตแถวสอง sum = 0; // ตัวเลขโรงงานสำหรับ (A = 1; (int) sum+ 1; // ความยาวของข้อมูล int [] fact = new int [digit]; // เริ่มต้นข้อเท็จจริงอาร์เรย์ [0] = 1; // สมมติว่าตัวเลขหลักเดียวคือ 1 for (a = 2; a <= biginteger; a ++) // multiple 2^biginteger กับผลิตภัณฑ์ดั้งเดิม ความจริง [b]! = 0) {pos = b; // บันทึกการแตกบิตสูงสุด;}} สำหรับ (b = 0; b <= pos; b ++) {ความจริง [b] *= a; // แต่ละบิตถูกคูณด้วยฉัน} พกพา break;}} system.out.println (biginteger+"ผลลัพธ์จากโรงงานคือ:"); สำหรับ (a = pos; a> = 0; a -) // ผลการคำนวณเอาท์พุท {system.out.print (ข้อเท็จจริง [a]); m ++; ถ้า (m % 5 == 0) {system.out.print ("" "); ; n ++; ถ้า (10 == n) {system.out.print ("/n"); n = 0;}}} system.out.println ("/n"+"แฟคทอเรียลมี:"+(pos+1)+"บิต"); this.bigfactorial (biginteger); int timefinishi = (int) system.currenttimeMillis (); เวลา int = timefinishi-timebegin; system.out.println ("เวลาการคำนวณ:" + เวลา + "msec"); BigInteger (); Bi.DobigFactorial (100000);}}คำนวณแฟคทอเรียล 10,000 และแสดงสิ่งต่อไปนี้:
เป็นผลให้คอนโซลเห็นได้ชัดว่าไม่สามารถบันทึกเนื้อหาได้ มี 450,000 แฟคทอเรียล 100,000 ซึ่งเทียบเท่ากับนวนิยายที่มี 450,000 คำ ผลลัพธ์แฟคทอเรียลของ 1,000 มีดังนี้:
คอนโซลสามารถแสดงเต็มได้
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับคำอธิบายโดยละเอียดเกี่ยวกับรหัสอัลกอริทึมขนาดใหญ่จำนวนเต็มขนาดใหญ่ของ Java - ระดับ 10,000 ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงเว็บไซต์นี้ต่อไปได้:
" การวิเคราะห์รหัสการทำงานของค่าดัชนีพลังงานใน Java "
" ตัวอย่างรหัสการใช้งานการเขียนโปรแกรม Java สำหรับการดำเนินงานพิเศษหรือการดำเนินการของ hexadecimal strings "
" Java Programming ใช้การกรองความร่วมมือแบบใช้โดยใช้ตัวอย่างรหัสอัลกอริทึมที่แนะนำตัวอย่าง "
หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!