สมมติว่าเรามีตัวเลข เราต้องแปลงเป็นเลขโรมันที่เท่ากัน เลขโรมันประกอบด้วยสัญลักษณ์และค่าดังต่อไปนี้ -
- "ฉัน" =1
- "วี" =5
- "X" =10
- "L" =50
- "C" =100
- "D" =500
- "M" =1,000
โดยทั่วไปแล้ว สัญลักษณ์เหล่านี้จะถูกเขียนจากมากไปหาน้อย และเรียงจากซ้ายไปขวา และสามารถคำนวณได้โดยการรวมค่าของสัญลักษณ์ทั้งหมด แต่มีบางกรณีพิเศษที่สัญลักษณ์ที่มีค่าต่ำกว่าอยู่ทางซ้ายของสัญลักษณ์ที่มีมูลค่าสูงกว่าของเขา แสดงว่าค่าที่ต่ำกว่านั้นถูกลบออกจากค่าที่สูงกว่า
นี่คือตัวอย่างกรณีดังกล่าว −
- "I" อยู่ก่อน "V" ค่า 4
- "I" อยู่ก่อน "X" ค่า 9
- "X" อยู่ก่อน "L" ค่า 40
- "X" อยู่ก่อน "C" ค่า 90
- "C" อยู่ก่อน "D" ค่า 400.
- "C" อยู่ก่อน "M" ค่า 900
ในเลขโรมันยังมีกฎอยู่สองสามข้อ –
- ไม่มีสัญลักษณ์ซ้ำเกิน 3 ครั้ง
- สัญลักษณ์ "V", "L" และ "D" ไม่ซ้ำกัน
ดังนั้น หากอินพุตเป็น n =1520 เอาต์พุตจะเป็น "MDXX" เนื่องจาก "MDXX" หมายถึง 1,000 + 500 + 10 + 10 =1520
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- res :=สตริงว่าง
- ตาราง =รายการที่มีคู่ (val, symbol) ในรูปแบบนี้ โดยที่ val คือค่าและสัญลักษณ์คือสัญลักษณ์ที่เกี่ยวข้อง [(1000, "M"), (900, "CM"), (500, " D"), (400, "CD"), (100, "C"), (90, "XC"), (50, "L"), (40, "XL"), (10, "X" ), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")]
- สำหรับแต่ละคู่ (หมวก, โรมัน) ในตาราง ทำ
- d :=ชั้นของ num/cap
- m :=num mod cap
- res :=res + โรมัน * d
- num :=ม.
- ผลตอบแทน
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def solve(num): res = "" table = [ (1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"), (90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I"), ] for cap, roman in table: d, m = divmod(num, cap) res += roman * d num = m return res num = 1520 print(solve(num))
อินพุต
1520
ผลลัพธ์
MDXX