1. แนวคิด
ก่อนอื่นให้เข้าใจว่าตัวเลขที่สมบูรณ์แบบคืออะไร?
คำอธิบายปัญหา: หากตัวเลขตามธรรมชาติผลรวมของปัจจัยที่แท้จริงทั้งหมด (เช่นตัวหารนอกเหนือจากตัวเอง) จะเท่ากับมันและตัวเลขนี้เรียกว่าหมายเลขที่สมบูรณ์ ย่อเป็น "หมายเลขเสร็จ"
ตัวอย่างเช่น,
6 = 1+2+3
28 = 1+2+4+7+14
496 = 1+2+4+8+16+31+62+124+248
8128 = 1+2+4+8+16+32+64+127+254+508+1016+2032+4064
ตามคำจำกัดความของหมายเลขที่เสร็จแล้วมันไม่ยากเกินไปที่จะแก้ไขหมายเลขโดยใช้โปรแกรม ก่อนอื่นให้แก้ปัจจัยที่แท้จริงทั้งหมดของหมายเลขนี้จากนั้นเพิ่มพวกเขาเพื่อตรวจสอบว่ามันเท่ากับหรือไม่ อย่างไรก็ตามเมื่อตัวเลขนี้มีขนาดเล็กมากไม่มีปัญหา เมื่อตัวเลขนี้เกินค่าที่กำหนดปัญหาจะเกิดขึ้นและประสิทธิภาพการดำเนินการของโปรแกรมจะถูกดูถูก
เมื่อเราเพิ่มประสิทธิภาพตรรกะอัลกอริทึมของโปรแกรมเรามักจะพิจารณาคำถาม: วิธีใช้ประโยชน์จากคุณสมบัติของคอมพิวเตอร์อย่างมีประสิทธิภาพ มีงานที่ไร้ประโยชน์มากมายในอัลกอริทึมที่กำหนดหรือไม่? โดยการพิจารณาปัญหานี้ตามแนวความคิดนี้เราจะได้รับทางออกอื่นในไม่ช้า
2. คำอธิบาย
2.1 การวิเคราะห์
ที่นี่เราจะนึกถึงปัจจัยการสลายตัวที่เราพูดถึงก่อนหน้านี้ได้อย่างง่ายดายหรือไม่? ใช่เมื่อแก้ตัวเลขที่สมบูรณ์แบบเราจะใช้ปัจจัยการสลายตัว โดยทั่วไปการพูดการแก้จำนวนที่สมบูรณ์จะผ่านสามขั้นตอน:
1. ค้นหาตัวเลขที่สำคัญจำนวนหนึ่ง
2. ใช้ตารางหมายเลขหลักเพื่อค้นหาการแยกตัวประกอบของจำนวนที่ระบุ
3. การใช้ปัจจัยการใช้งานเพื่อค้นหาปัจจัยที่แท้จริงทั้งหมดและตรวจสอบว่าเป็นจำนวนที่สมบูรณ์แบบว่าเป็นจำนวนที่สมบูรณ์
2.2 ปัญหา
หลังจากมองครั้งแรกไม่มีปัญหากับขั้นตอนแรกและขั้นที่สอง เราได้พูดคุยกันในสองบทความก่อนหน้านี้ นักเรียนที่ไม่ชัดเจนเกี่ยวกับมันสามารถตรวจสอบได้
ประเด็นสำคัญคือในขั้นตอนที่สามวิธีค้นหาผลรวมปัจจัยที่แท้จริงได้อย่างไร? วิธีนี้ง่ายมาก ก่อนอื่นคุณต้องรู้ว่าการเพิ่มปัจจัยที่แท้จริงทั้งหมด (นักเรียนที่ไม่ทราบแนวคิดของปัจจัยที่แท้จริงไปและดู) และเพิ่มจำนวนตัวเองจะเป็นจำนวนสองเท่า (นักเรียนบางคนไม่รู้จัก แต่พวกเขาควรรู้ตอนนี้ใช่ไหม)
2 * 28 = 1 + 2 + 4 + 7 + 14 + 28
ในความเป็นจริงสมการนี้สามารถแปลงเป็น: (ข้อผิดพลาดในการป้อนรหัสฉันใช้ภาพหน้าจอ)
ค้นพบ? 2 และ 7 ทั้งคู่เป็นตัวประกอบดังนั้นจึงมีการทำให้โปรแกรมง่ายขึ้นหรือไม่?
2.3 บทสรุป
จำเป็นต้องมีการแยกปัจจัยเท่านั้นและคุณสามารถใช้ลูปเพื่อค้นหาค่าหลังจากสมการและหารค่า 2 เป็นผลรวมปัจจัยที่แท้จริง เมื่อคุณดูสมการครั้งแรกคุณอาจนึกถึงการใช้สูตรซีรีย์สมการเพื่อแก้ปัญหา แต่คุณจะใช้การทำงานของพลังงาน คุณสามารถคำนวณค่าหลังจากสมการในเวลาเดียวกันเมื่ออ่านอาร์เรย์การแยกตัวประกอบ
3. รหัส
นำเข้า java.util.arraylist; // แก้ปัญหาระดับสาธารณะที่สมบูรณ์แบบ PerfectNumber {// ส่งผ่านในค่าและแก้ปัญหาอย่างน้อยจำนวนที่สมบูรณ์แบบ public public public int [] lessthan (หมายเลข int) {int [] primes = prime.findprimes (จำนวน); arraylist list = new ArrayList (); สำหรับ (int i = 1; i <= number; i ++) {int [] ปัจจัย = ปัจจัย (primes, i); if (i == fsum (ปัจจัย)) list.add (จำนวนเต็มใหม่ (i)); } int [] p = new int [list.size ()]; Object [] objs = list.toarray (); สำหรับ (int i = 0; i <p.length; i ++) {p [i] = ((จำนวนเต็ม) objs [i]). intvalue (); } return p; } // decompose ปัจจัยเอกชนคงที่ int [] ปัจจัย (int [] primes, หมายเลข int) {int [] frecord = new int [number]; int k = 0; สำหรับ (int i = 0; math.pow (primes [i], 2) <= number;) {ถ้า (หมายเลข % primes [i] == 0) {frecord [k] = primes [i]; K ++; หมายเลข /= primes [i]; } else i ++; } frecord [k] = number; ส่งคืน frecord; } // factor sum private static int fsum (int [] farr) {int i, r, s, q; i = 0; r = 1; s = 1; Q = 1; ในขณะที่ (i <farr.length) {do {r *= farr [i]; Q += R; i ++; } ในขณะที่ (i <farr.length - 1 && farr [i -1] == farr [i]); S *= Q; r = 1; Q = 1; } return s / 2; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {int [] pn = perfectnumber.lessthan (1,000); สำหรับ (int i = 0; i <pn.length; i ++) {system.out.print (pn [i]+""); } system.out.println (); -สรุป
ข้างต้นคือทั้งหมดที่เกี่ยวกับการวิเคราะห์รหัสตัวเลขที่สมบูรณ์แบบในบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น!