ฉันเห็นว่าผู้คนจำนวนมากตอบคำถามเกี่ยวกับการล้น แต่ฉันต้องการที่จะแก้ไขปัญหาเดิมของเขา เขากล่าวว่าปัญหาคือการหาb = c เช่นนั้นตัวเลขทั้งหมดจะถูกใช้โดยไม่ต้องทำซ้ำ ตกลงนั่นไม่ใช่สิ่งที่เขาถามในโพสต์นี้ แต่ฉันก็ยังคิดว่ามันจำเป็นที่จะต้องศึกษาขอบเขตของปัญหาและสรุปว่าเขาไม่จำเป็นต้องคำนวณหรือตรวจพบการไหลล้น (หมายเหตุ: ฉันไม่ชำนาญ ในวิชาคณิตศาสตร์ฉันทำทีละขั้นตอน แต่ผลลัพธ์สุดท้ายนั้นง่ายมากจนอาจมีสูตรง่าย ๆ )
ประเด็นหลักคือขอบเขตบนที่ปัญหาต้องการสำหรับ a, b หรือ c คือ 98.765.432 อย่างไรก็ตามเริ่มต้นด้วยการแยกปัญหาในส่วนที่ไม่สำคัญและไม่สำคัญ:
- x 0 == 1 (การเรียงลำดับทั้งหมดของ 9, 8, 7, 6, 5, 4, 3, 2 เป็นคำตอบ)
- x 1 == x (ไม่สามารถหาทางออกได้)
- 0 b == 0 (ไม่สามารถหาทางออกได้)
- 1 b == 1 (ไม่สามารถหาทางออกได้)
- a b , a> 1, b> 1 (ไม่สำคัญ)
ตอนนี้เราเพียงแค่ต้องแสดงให้เห็นว่าไม่มีวิธีการแก้ปัญหาอื่นใดที่เป็นไปได้และมีเพียงวิธีการเปลี่ยนลำดับที่ถูกต้องเท่านั้น เรากลับไปที่ขอบเขตบน ที่จริงแล้วขอบเขตบนคือ c ≤ 98.765.432 มันคือขอบเขตสูงสุดเพราะเป็นจำนวนที่มากที่สุดด้วย 8 หลัก (รวม 10 หลักลบ 1 สำหรับแต่ละ a และ b) ขอบเขตบนนี้มีไว้สำหรับ c เท่านั้นเนื่องจากขอบเขตสำหรับ a และ b ต้องต่ำกว่ามากเนื่องจากการเติบโตแบบเอ็กซ์โปเนนเชียลเนื่องจากเราสามารถคำนวณได้เปลี่ยนแปลง b จาก 2 ถึงขอบเขตบน:
9938.08^2 == 98765432
462.241^3 == 98765432
99.6899^4 == 98765432
39.7119^5 == 98765432
21.4998^6 == 98765432
13.8703^7 == 98765432
9.98448^8 == 98765432
7.73196^9 == 98765432
6.30174^10 == 98765432
5.33068^11 == 98765432
4.63679^12 == 98765432
4.12069^13 == 98765432
3.72429^14 == 98765432
3.41172^15 == 98765432
3.15982^16 == 98765432
2.95305^17 == 98765432
2.78064^18 == 98765432
2.63493^19 == 98765432
2.51033^20 == 98765432
2.40268^21 == 98765432
2.30883^22 == 98765432
2.22634^23 == 98765432
2.15332^24 == 98765432
2.08826^25 == 98765432
2.02995^26 == 98765432
1.97741^27 == 98765432
ประกาศตัวอย่างเช่นบรรทัดสุดท้าย: มันบอกว่า 1.97 ^ 27 ~ 98M ตัวอย่างเช่น 1 ^ 27 == 1 และ 2 ^ 27 == 134.217.728 และนั่นไม่ใช่วิธีแก้ปัญหาเพราะมันมี 9 หลัก (2> 1.97 ดังนั้นมันจึงใหญ่กว่าที่ควรทดสอบ) จะเห็นได้ว่าชุดค่าผสมที่มีสำหรับการทดสอบ a และ b นั้นมีขนาดเล็กมาก สำหรับ b == 14 เราต้องลอง 2 และ 3 สำหรับ b == 3 เราเริ่มที่ 2 และหยุดที่ 462 ผลลัพธ์ทั้งหมดจะได้รับน้อยกว่า ~ 98M
ตอนนี้เพียงทดสอบชุดค่าผสมทั้งหมดด้านบนแล้วค้นหาค่าที่ไม่ซ้ำตัวเลขใด ๆ :
['0', '2', '4', '5', '6', '7', '8'] 84^2 = 7056
['1', '2', '3', '4', '5', '8', '9'] 59^2 = 3481
['0', '1', '2', '3', '4', '5', '8', '9'] 59^2 = 3481 (+leading zero)
['1', '2', '3', '5', '8'] 8^3 = 512
['0', '1', '2', '3', '5', '8'] 8^3 = 512 (+leading zero)
['1', '2', '4', '6'] 4^2 = 16
['0', '1', '2', '4', '6'] 4^2 = 16 (+leading zero)
['1', '2', '4', '6'] 2^4 = 16
['0', '1', '2', '4', '6'] 2^4 = 16 (+leading zero)
['1', '2', '8', '9'] 9^2 = 81
['0', '1', '2', '8', '9'] 9^2 = 81 (+leading zero)
['1', '3', '4', '8'] 3^4 = 81
['0', '1', '3', '4', '8'] 3^4 = 81 (+leading zero)
['2', '3', '6', '7', '9'] 3^6 = 729
['0', '2', '3', '6', '7', '9'] 3^6 = 729 (+leading zero)
['2', '3', '8'] 2^3 = 8
['0', '2', '3', '8'] 2^3 = 8 (+leading zero)
['2', '3', '9'] 3^2 = 9
['0', '2', '3', '9'] 3^2 = 9 (+leading zero)
['2', '4', '6', '8'] 8^2 = 64
['0', '2', '4', '6', '8'] 8^2 = 64 (+leading zero)
['2', '4', '7', '9'] 7^2 = 49
['0', '2', '4', '7', '9'] 7^2 = 49 (+leading zero)
ไม่มีใครตรงกับปัญหา (ซึ่งสามารถเห็นได้โดยไม่มี '0', '1', ... , '9')
ตัวอย่างรหัสที่แก้ได้ตามมา นอกจากนี้โปรดทราบว่าเขียนไว้ใน Python ไม่ใช่เพราะมันต้องการจำนวนเต็มความแม่นยำตามอำเภอใจ (รหัสไม่คำนวณอะไรที่ใหญ่กว่า 98 ล้าน) แต่เนื่องจากเราพบว่าจำนวนการทดสอบมีขนาดเล็กมากจนเราควรใช้ภาษาระดับสูงเพื่อ ใช้ประโยชน์จากคอนเทนเนอร์และไลบรารีในตัว (โปรดทราบว่า: รหัสมี 28 บรรทัด)
import math
m = 98765432
l = []
for i in xrange(2, 98765432):
inv = 1.0/i
r = m**inv
if (r < 2.0): break
top = int(math.floor(r))
assert(top <= m)
for j in xrange(2, top+1):
s = str(i) + str(j) + str(j**i)
l.append((sorted(s), i, j, j**i))
assert(j**i <= m)
l.sort()
for s, i, j, ji in l:
assert(ji <= m)
ss = sorted(set(s))
if s == ss:
print '%s %d^%d = %d' % (s, i, j, ji)
# Try with non significant zero somewhere
s = ['0'] + s
ss = sorted(set(s))
if s == ss:
print '%s %d^%d = %d (+leading zero)' % (s, i, j, ji)