จูเนียร์ถามคำถามสัมภาษณ์ Java มาก่อน แต่คำถามนั้นไม่ยาก ใช้สามเหลี่ยม Yang Hui กับ Java ฉันใช้เวลาพอสมควรในการแยกแยะและพบว่ามันค่อนข้างน่าสนใจดังนั้นฉันจึงต้องการเขียนมันและแบ่งปัน ก่อนที่จะเขียนรหัสก่อนอื่นให้ชี้แจงคำถามสองข้อต่อไปนี้
สามเหลี่ยมหยางฮุ่ยคืออะไร
สามเหลี่ยมของหยางฮุ่ยเป็นการจัดเรียงทางเรขาคณิตของสัมประสิทธิ์ทวินามในรูปสามเหลี่ยม มันถูกกล่าวถึงใน "คำอธิบายรายละเอียดของอัลกอริทึมเก้าบท" ที่เขียนโดย Yang Hui นักคณิตศาสตร์ของราชวงศ์ซ่งใต้ในประเทศของฉันในปี 1261 ในยุโรปเรียกว่า Pascal Triangle ดังที่แสดงในรูป
สามเหลี่ยมหยางฮุ่ย
กฎของสามเหลี่ยมของหยางฮุ่ยเป็นหลักการ
1. แต่ละหมายเลขเท่ากับผลรวมของตัวเลขสองตัวด้านบน
2. แต่ละแถวของตัวเลขมีความสมมาตรซ้ายและขวาและค่อย ๆ จะใหญ่ขึ้นจาก 1
3. จำนวนในบรรทัด n มีคำ n
4. ผลรวมของหมายเลขบรรทัด N-TH คือ 2N-1
5. จำนวน M ในแถวที่ N สามารถแสดงเป็น C (N-1, M-1) นั่นคือจำนวนการรวมกันขององค์ประกอบ M-1 ที่นำมาจากองค์ประกอบที่แตกต่างกันของ N-1
6. หมายเลข MTH ในบรรทัด N เท่ากับ N-M+1 หมายเลขซึ่งเป็นหนึ่งในคุณสมบัติของหมายเลขรวม
7. แต่ละหมายเลขเท่ากับผลรวมของหมายเลขซ้ายและขวาของบรรทัดก่อนหน้า คุณสมบัตินี้สามารถใช้ในการเขียนสามเหลี่ยมหยางฮุ่ยทั้งหมด นั่นคือหมายเลข i-th ในบรรทัด N+1 เท่ากับผลรวมของหมายเลข I-1 และหมายเลข i-th ในบรรทัด N ซึ่งเป็นหนึ่งในคุณสมบัติของหมายเลขรวม นั่นคือ c (n+1, i) = c (n, i)+c (n, i-1)
8. ค่าสัมประสิทธิ์ในสูตรการขยายตัวของ (a+b) n สอดคล้องกับแต่ละรายการในบรรทัด (n+1) ของสามเหลี่ยมหยางฮุ่ย
9. เชื่อมต่อหมายเลขแรกในบรรทัด 2N+1 โดยมีหมายเลขที่สามในบรรทัด 2N+2 หมายเลขที่ห้าในบรรทัด 2N+3 และผลรวมของตัวเลขเหล่านี้คือหมายเลข 4N+1 ฟีโบนักชี; โอนหมายเลขที่สองในบรรทัด 2N-1 (n> 1) โดยมีหมายเลขที่สี่ในบรรทัด 2N-2 และหมายเลขที่หกในบรรทัด 2N-2 ... ผลรวมของตัวเลขเหล่านี้คือหมายเลข Fibonacci 4N-2
10. จัดเรียงตัวเลขในแต่ละแถวและคุณสามารถรับ N-1 ของ 11 (n คือจำนวนแถว) กำลังไฟ: 1 = 11^0; 11 = 11^1; 121 = 11^2 ... เมื่อ n> 5 มันจะไม่ตรงกับคุณสมบัตินี้ ในเวลานี้หมายเลขที่ถูกต้องที่สุด "1" บนบรรทัดที่ N ควรวางไว้ในตัวเลขหลักเดียวจากนั้นจัดตำแหน่งตัวเลขหลักเดียวของตัวเลขทางด้านซ้ายถึงสิบหลัก ...... และอื่น ๆ เติมพื้นที่ว่างด้วย "0" แล้วเพิ่มตัวเลขทั้งหมดเข้าด้วยกัน 1,10,45,120,210,252,210,120,45,10,1 และผลลัพธ์คือ 25937424601 = 1110
หลังจากทำความเข้าใจสองจุดนี้ความคิดของเราจะชัดเจนมาก มีหลายวิธีในการใช้งานที่นี่ฉันวางแผนที่จะใช้อาร์เรย์สองมิติรวมทั้งคู่สำหรับการวนซ้ำเพื่อนำไปใช้
รหัสสาธิต:
ระดับสาธารณะ Yanghui {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// สร้างอาร์เรย์สองมิติ int t [] [] = ใหม่ int [10] []; // สำรวจชั้นแรกของอาร์เรย์สองมิติสำหรับ (int i = 0; i <t.length; i ++) {// เริ่มต้นขนาดของอาร์เรย์เลเยอร์ที่สอง t [i] = new int [i+1]; // Traverse อาร์เรย์เลเยอร์ที่สองสำหรับ (int j = 0; j <= i; j ++) {// กำหนดองค์ประกอบอาร์เรย์ทั้งสองด้านเป็น 1 ถ้า (i == 0 || j == 0 || j == i) {t [i] [j] = 1; } else {// ค่าอื่น ๆ ถูกคำนวณโดยสูตร t [i] [j] = t [i-1] [j]+t [i-1] [j-1]; } // องค์ประกอบอาร์เรย์เอาต์พุต System.out.print (t [i] [j]+"/t"); } // line break system.out.println (); -ผลลัพธ์ผลลัพธ์ในคอนโซลมีดังนี้:
มีสามแถวของสามเหลี่ยม Yang Hui เท่านั้นที่จะส่งออกที่นี่ ปรับให้เหมาะสมและสามารถเปลี่ยนเป็นแบบไดนามิกที่ได้รับจำนวนแถว นอกจากนี้ยังสามารถเปลี่ยนเป็นสามเหลี่ยมเชิงบวกเพียงเพิ่มลูปเพื่อคำนวณพื้นที่ นักเรียนที่สนใจสามารถลองได้ -จากโปรแกรมเมอร์ Java 18 สาย
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น