পাইথনে একটি সংখ্যা (num) কে এর সমতুল্য রোমান নুমেরাল (Roman numeral) এ রূপান্তর করার প্রোগ্রাম।
রোমান নুমেরালের সিম্বল ও মান
| সিম্বল | মান |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
বিশেষ নিয়ম (Subtractive Notation)
- I, V-এর বামে -> 4 (IV)
- I, X-এর বামে -> 9 (IX)
- X, L-এর বামে -> 40 (XL)
- X, C-এর বামে -> 90 (XC)
- C, D-এর বামে -> 400 (CD)
- C, M-এর বামে -> 900 (CM)
নિયমাবলী
- কোনো সিম্বল ৩ বার ਤੋਂ বেশি রিপিট হয় না।
- V, L, D রিপিট হয় না।
- বড় থেকে ছোট সিম্বল বাম থেকে ডানে লেখা হয়।
এলগরিদম
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')]- প্রতিটি (cap, roman) জোড়ার জন্য:
d, m = divmod(num, cap)(ভাগফল এবং ভাগশেষ)res += roman * dnum = m
resরিটার্ন করুন
পাইথন ইমপ্লিমেন্টেশন
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)) # Output: MDXX
ইনপুট
1520
আউটপুট
MDXX
ব্যাখ্যা
- 1520 = 1000 (M) + 500 (D) + 10 (X) + 10 (X) = MDXX
divmodফাংশন একসাথে ভাগফল এবং ভাগশেষ রিটার্ন করে, যা কোডকে সংক্ষিপ্ত করে।- টেবিলে সাবট্র্যাক্টিভ নোটেশন (900=CM, 400=CD, 90=XC, ইত্যাদি) ইতিমধ্যে অন্তর্ভুক্ত থাকায় আলাদা লজিক লাগে না।
সময় জটিলতা
O(1) — কারণ টেবিলের সাইজ স্থির (১৩ টি এন্ট্রি), ইনপুট সাইজের ওপর নির্ভরশীল নয়।