تبدیل مبنا
عدد را با تقسیمهای پیاپی بر مبنا به مبنای دیگر میبرد؛ باقیماندهها از آخر به اول، رقمهای جواباند.
در مبنای b، رقم سمت راست عدد n همان n mod b است و بقیهی رقمها عدد n div b را میسازند. پس:
- زمان:
O(log_b n) - حافظه:
O(log_b n) - گریمالدی، فصل ۴
- جانسونباو، فصل ۵
۱۵۶ در مبنای ۲: هشت تقسیم و جواب 10011100.
DIGITS = "0123456789ABCDEF"def to_base(n, base):if n == 0:return "0"rows = []digits = ""while n > 0:q = n // baser = n % baserows.append((n, q, r, DIGITS[r]))digits = DIGITS[r] + digitsn = qreturn digits
شروع اجرا
n156
digits—
جدول هنوز خالی است.
متغیرهای محلی
n156
base2
نارنجی = در همین گام عوض شد
Call stack
- to_base()خط 4
گام ۱ از ۵۴
توضیح
ایده
در مبنای b، رقم سمت راست عدد n همان n mod b است و بقیهی رقمها عدد n div b را میسازند. پس:
nرا برbتقسیم کن؛ باقیمانده رقم بعدی (از راست) است.- با خارجقسمت ادامه بده تا صفر شود.
رقمها از آخر به اول به دست میآیند؛ برای همین هر رقم تازه جلوی رشته گذاشته میشود. برای مبناهای بزرگتر از ۱۰، رقمهای ۱۰ تا ۱۵ را با A تا F مینویسیم.
هزینه
هر تقسیم یک رقم میدهد: O(log_b n) تقسیم.
در trace به چه چیزی نگاه کنی
- جدول همان تقسیمهای پیاپی روی کاغذ است؛ ستون
digitرا از پایین به بالا بخوان.