Hướng dẫn recursive algorithm for converting decimal to any base python - thuật toán đệ quy để chuyển đổi số thập phân thành bất kỳ python cơ sở nào

Tôi khuyên bạn nên cấu trúc mã của bạn một cách chính xác hơn. Bạn có thể phân chia nhiệm vụ được chỉ định một cách mơ hồ mà bạn đề cập theo các nhiệm vụ phụ khác nhau, ví dụ:

  • Xác định và bình thường hóa các dấu hiệu của số và cơ sở (bạn cần hỗ trợ các cơ sở tiêu cực hoặc bạn có thể chỉ tăng một ngoại lệ?), Cũng đảm bảo một ngoại lệ ngay lập tức được nêu ra trong các trường hợp lỗi (ví dụ: cơ sở 0 hoặc 1);
  • Viết một hàm (đưa ra các giá trị tích cực và chính xác cho ab) trả về một "chuỗi chữ số" để biểu thị a trong cơ sở b, trong đó "chữ số" là một số nguyên giữa 0 bao gồm và b được loại trừ;
  • Viết một hàm đưa ra dấu hiệu và trình tự mở rộng của các chữ số được xây dựng và trả về một biểu diễn chuỗi-tùy thuộc vào cách bạn muốn biểu diễn "chữ số" rất lớn khi B lớn, giả sử> 36 Nếu bạn muốn sử dụng các chữ số Các chữ cái ASCII, cho 36 chữ số đầu tiên theo cách rõ ràng; Có lẽ bạn nên chấp nhận chuỗi "bảng chữ cái" để sử dụng cho mục đích (và hàm đầu tiên ở trên sẽ tăng ngoại lệ khi B quá lớn cho bảng chữ cái đã cho)
  • Viết một chức năng sử dụng tất cả những cái trên để in chuỗi ra

Trong số các nhiệm vụ này, chỉ có nhiệm vụ thứ hai có thể được coi là phù hợp với việc thực hiện "đệ quy" nếu một người khăng khăng (mặc dù việc thực hiện lặp đi lặp lại trên thực tế là tự nhiên hơn nhiều!) - cho rằng đây là bài tập về nhà, tôi đoán bạn sẽ phải Làm điều đó một cách đệ quy vì đó là một phần của nhiệm vụ được giao, À!-). Nhưng, để tham khảo, một cách rõ ràng để lặp lại sẽ là:

  def digitsequence(a, b):
    results = []
    while True:
      results.append(a % b)
      if a < b: break
      a //= b
    return reversed(results)

Giả sử một người muốn chuỗi chữ số theo thứ tự "endian lớn" mà chúng ta đã sử dụng từ cách ký hiệu thập phân vị trí đi vào văn hóa phương Tây (đó là thứ tự nhỏ tính hơn tự nhiên hơn trong bản gốc tiếng Ả Rập ... nhưng tiếng Ả Rập được viết Phải sang trái, phiên âm theo nghĩa đen của trật tự đó bằng các ngôn ngữ châu Âu, được viết từ trái sang phải, đã trở thành Big-endian!-).

Dù sao, bạn có thể nhận đệ quy đơn giản, tuyến tính như một cách để "đảo ngược" mọi thứ ngầm (bạn có thể nói đệ quy như vậy "ẩn" một ngăn xếp cuối cùng, đầu tiên, rõ ràng là một cách để đảo ngược một chuỗi ;-), mà tôi đoán là nơi thông số kỹ thuật đệ quy trong bài tập về nhà có thể đến từ ;-).

Bài đăng này liên quan đến các phương thức để liên kết thập phân với bất kỳ số hệ thống cơ sở nào vào bất kỳ cơ sở nào tùy thuộc vào đầu vào của người dùng trong Python.

Điều kiện tiên quyết: Những điều cơ bản của các cấu trúc vòng Python

Thập phân cho bất kỳ cơ sở nào - phương pháp

Thuật toán cơ bản cho chuyển đổi này là chia liên tục (phân chia số nguyên) Số thập phân đã cho cho giá trị cơ sở đích cho đến khi số thập phân trở thành 0. Tuy nhiên, phần còn lại trong mỗi trường hợp tạo thành các chữ số của số trong hệ thống cơ sở mới, tuy nhiên, trong thứ tự ngược lại.

Một giới hạn trên

Thuật toán nói chung sẽ hoạt động cho bất kỳ cơ sở nào, nhưng chúng tôi cần các chữ số/ký tự để biểu thị nhiều số của một hệ thống cơ sở. Để đơn giản, chúng tôi giới hạn bản thân ở cơ sở 36 tức là 10 số + 26 bảng chữ cái. (Chúng tôi có thể phân biệt trường hợp thấp hơn và trên, nhưng chúng tôi dự định tập trung vào thuật toán ở đây!). Sẽ rõ ràng sau khi thực hiện rằng phương pháp phải hoạt động cho bất kỳ cơ sở nào.

Số thập phân cho bất kỳ cơ sở nào - thực hiện Python

Xem xét chương trình sau,

def dec_to_base(num,base):  #Maximum base - 36
    base_num = ""
    while num>0:
        dig = int(num%base)
        if dig<10:
            base_num += str(dig)
        else:
            base_num += chr(ord('A')+dig-10)  #Using uppercase letters
        num //= base

    base_num = base_num[::-1]  #To reverse the string
    return base_num

Lưu ý điều kiện IF được sử dụng để kiểm tra xem các chữ số 0-9 có đủ để chứa tất cả các chữ số trong cơ sở không. Mặt khác, chúng tôi đang gán một bảng chữ cái phù hợp cho chữ số.

Ord ()-Hàm tích hợp trả về giá trị ASCII của ký tự

CHR ()-Hàm tích hợp trả về ký tự có giá trị ASCII-

Dòng cuối cùng được sử dụng như một hoạt động đảo ngược chuỗi. Về cơ bản, nó tạo ra một lát chuỗi từ đầu đến cuối (được biểu thị bằng hai đối số trống đầu tiên) bằng cách đi từ cuối để bắt đầu (được biểu thị bằng -1).

Đây là một đầu ra mẫu, chuyển đổi thành cơ sở 28

Hướng dẫn recursive algorithm for converting decimal to any base python - thuật toán đệ quy để chuyển đổi số thập phân thành bất kỳ python cơ sở nào

Do đó, chúng tôi có thể chuyển đổi một số thập phân thành bất kỳ cơ sở nào cần thiết.

Một số phương pháp chuyển đổi cơ sở tích hợp

Python cung cấp một số phương pháp chuyển đổi cơ sở tích hợp cho các số nhị phân, bát phân và thập lục phân.

Việc sử dụng rất đơn giản:

Bin () - Trả về một chuỗi, là biểu diễn nhị phân của số thập phân

OCT () - Trả về một chuỗi, là đại diện bát phân của số thập phân

Hex () - Trả về một chuỗi, là đại diện của số thập phân của số thập phân

Bất kỳ cơ sở nào để thập phân

Python cũng cung cấp chuyển đổi dễ dàng từ bất kỳ cơ sở nào sang số thập phân. Điều này được thực hiện bằng cách đơn giản là chuyển một chuỗi có biểu diễn cơ sở khác của số thập phân và giá trị cơ sở là đối số thứ hai. Nó trả lại số thập phân!

print int("1123",5)   #Prints string given in base-5 in decimal

Đầu ra là: 163

Thuật toán và thực hiện cho bất kỳ cơ sở nào

Logic rất đơn giản. Chúng ta chỉ cần nhân mỗi chữ số tại một vị trí với giá trị cơ sở được nâng lên giá trị vị trí (bắt đầu từ 0 từ bên phải). Đó là cách một hệ thống cơ sở được xác định, trong thực tế.

Chẳng hạn, nếu 1011 là số nhị phân, tương đương thập phân là

(1 x 2^0) + (1 x 2^1) + (0 x 2^2) + (1 x 2^3) = 11

Chương trình sau đây minh họa tương tự,

def base_to_dec(num_str,base):
    num_str = num_str[::-1]
    num = 0
    for k in range(len(num_str)):
        dig = num_str[k]
        if dig.isdigit():
            dig = int(dig)
        else:    #Assuming its either number or alphabet only
            dig = ord(dig.upper())-ord('A')+10
        num += dig*(base**k)
    return num

Dưới đây là đầu ra mẫu cho cùng một giá trị được chuyển đổi trong đầu ra trước

Hướng dẫn recursive algorithm for converting decimal to any base python - thuật toán đệ quy để chuyển đổi số thập phân thành bất kỳ python cơ sở nào

Hãy thoải mái để lại bất kỳ loại phản hồi, gợi ý, nghi ngờ bên dưới.