ภาพรวม
บทความนี้ตรวจสอบว่า "ตัวเลขย่อย" (sub-numbers) ทุกตัวของเลข n มี "ผลคูณหลัก" (digit product) ที่ไม่ซ้ำกันหรือไม่ ตัวเลขย่อยคือเลขที่สร้างจากหลักติดกันของเลขต้นฉบับ
ตัวอย่าง
เลข 135 มีตัวเลขย่อย: 1, 3, 5, 13, 35, 135
ผลคูณหลัก: 1, 3, 5, 3, 15, 15 → มีซ้ำ (3 และ 15) → คืนค่า False
เลข 235 มีตัวเลขย่อย: 2, 3, 5, 23, 35, 235
ผลคูณหลัก: 2, 3, 5, 6, 15, 30 → ทั้งหมดไม่ซ้ำ → คืนค่า True
อัลกอริทึม
- แปลงเลขเป็นสตริง แล้วแยกเป็นลิสต์หลัก
- ใช้ลูป巢套 สร้างทุก substring (i ถึง j)
- คำนวณผลคูณหลักของแต่ละ substring
- เก็บในเซต ถ้าซ้ำ คืนค่า False
ตัวอย่างโค้ด Python
def dig_prod(digits):
product = 1
for d in digits:
product *= d
return product
def solve(num):
num_str = str(num)
length = len(num_str)
digits = [int(num_str[i]) for i in range(length)]
prod_set = set()
for i in range(length):
for j in range(i, length):
item = dig_prod(digits[i:j+1])
if item in prod_set:
return False
prod_set.add(item)
return True
n = 235
print(solve(n)) # True
ผลลัพธ์
True
คำอธิบายเพิ่มเติม
จำนวนตัวเลขย่อยของเลข n หลัก คือ n(n+1)/2 อัลกอริทึมนี้เป็น O(n^2) เหมาะสำหรับเลขไม่มากหลัก (เช่น < 10 หลัก)