ในการพัฒนา .NET บางครั้งเนื่องจากเนื้อหาความรู้ของวิชาส่วนเพิ่มบางวิชา เช่น สถิติ การเงิน ดาราศาสตร์ และการคำนวณอื่นๆ อัลกอริธึมการเข้ารหัสและการถอดรหัสจะเกี่ยวข้องกับการดำเนินการจำนวนมาก แม้ว่าประเภทตัวเลขที่ใหญ่ที่สุดใน .net จะถูกจัดเก็บไว้ก็ตาม จะล้น จำนวนหนึ่งในความคิดของฉันคือการใช้ประเภทตัวเลขเมื่อคำนวณและจัดเก็บ (ชั่วคราว) และส่งออกเป็นสตริง จากนั้นเมื่อจัดเก็บ BOX[n] n อาร์เรย์จำเป็นเพื่อจัดเก็บผลลัพธ์ของขั้นตอนเล็ก ๆ ใน การคำนวณ
'เป็นตัวอย่าง
=================== แผนภาพความเข้าใจอัลกอริทึม =======================
'97*97*97*97*97 = 8587340257 กล่อง(1) = 587340257 กล่อง(2)=8
'97*97*97*97*97*97 = 832972004929 กล่อง(1) = 972004929 กล่อง(2)=832
'97*97*97*97*97*97*97 = 80798284478113 กล่อง(1) = 284478113 กล่อง(2)=80798
'97*97*97*97*97*97*97*97 = 7837433594376961 กล่อง(1) = 594376961 กล่อง(2)=7837433
'97^ 9 = 760231058654565217 กล่อง(1) = 654565217 กล่อง(2)=760231058
'97^ 10 = 73742412689492826049 กล่อง(1) = 492826049 กล่อง(2)=742412689 กล่อง(3)=73
-
โปรดทราบว่ายิ่งช่องในตารางด้านล่างมีขนาดใหญ่เท่าใด จำนวนที่สอดคล้องกันก็จะยิ่งสูงขึ้นเท่านั้น เมื่อใช้อัลกอริทึมข้างต้น อย่าลืม 1 ก่อนกำหนดจำนวนหลักของ BOX เช่น ด้านบนคือ 9 หลัก (ตามความต้องการและตามจริง) เงื่อนไข),
2.เนื่องจากนิสัยการคำนวณ หลายๆ คนจะคำนวณจำนวนกล่อง (n+1) หลักก่อนเมื่อนับจากตำแหน่งด้านล่าง {box(0 -> n)} จากนั้นจึงเพิ่มหมายเลขพกพาที่สร้างโดย box(n) (เช่น เป็นครั้งแรก คำนวณ box(1) ถึง box(2)=0 เพื่อสร้างหมายเลขพกพา 8 กล่อง(2)+หมายเลขพกพา = 8) สำหรับการประมวลผล เช่น การประมวลผลเพิ่มเติมข้างต้น 3 วิธีที่ดีที่สุดคือเริ่มจากสูง ตำแหน่งจะช่วยประหยัดได้มาก ไม่ทราบจำนวนกล่อง ไม่สำคัญว่าจะใช้อาร์เรย์แบบไดนามิกเมื่อเต็ม (จำนวนการบรรทุกที่สร้างโดยกล่องตัวห้อยสูงสุด) มีการดำเนินการแบบโมดูโล หากโมดูลัสไม่มาก คุณสามารถใช้แนวคิดข้างต้นเพื่อคำนวณโมดูลัสเป็นชิ้น ๆ แล้วจึงลิงก์ กล่องนั้นเป็นผลลัพธ์ชั่วคราว และกล่องจะถูกแจกจ่ายอีกครั้ง (จะต้องตัดทอนใหม่) ตำแหน่งสูง) เช่น ถ้าเป็น modulo 123456789123456789 ให้ตั้งค่ากล่องด้วยตัวเลขแปดหลัก box(1)=89 box(2)=91234567 box(3)=12345678 แต่ละกล่องใช้โมดูลัสตามลำดับ คือ 123456789123456789 ۞ 333=370741108478849 โมดูลัส คือ 72) จากนั้นกล่องที่แจกจ่ายใหม่ควรเป็น box(1) =478849 box(2) =370741180 แต่ไม่ใช่ box(1) =370741180 box(2) = 478849 เพราะเหตุใด ∵ เริ่มรับโมดูลัส จาก ตำแหน่งสูง ถ้า box(n) ไม่เปลี่ยนแปลงหลังจากเป็น modulo หนึ่งครั้ง ผลลัพธ์ของการรับโมดูลัสอีกครั้งจะไม่เปลี่ยนแปลง และผลลัพธ์คือ box(n) = box(n) โปรแกรมจะเข้าสู่วงวนไม่สิ้นสุด
อีกสถานการณ์หนึ่งที่เกี่ยวข้องกับการดำเนินการจำนวนมากคือการนำโมดูโลของ A ยกกำลัง n (A ^n mod V) ถ้าจำนวน mod ไม่มากก็สามารถทำได้ (สิ้นสุดหลังจาก n A mod) ((A mod V)* A mod V) * mod V... อัลกอริธึมนี้ไม่จำเป็นต้องดำเนินการแบบวนซ้ำ สามารถใช้การวนซ้ำอย่างง่าย โดยมีการวนซ้ำซ้อนสูงสุดสองระดับ
คำแนะนำสุดท้าย: เมื่อบวก ลบ คูณ หรือหารจำนวนมาก อย่าแยกตัวประกอบการจ่ายเงินปันผล (บวก/ลบ/คูณ/หาร) ง่ายๆ อัลกอริทึมนี้จะไม่มีประสิทธิภาพมากนัก
(บทความนี้เขียนด้วยความเร่งรีบอาจมีการพิมพ์ผิดต้องขออภัยด้วย)
Source: Same BLOG