python3 第十九章 - 寫一個10進位轉任意進位的函數

来源:https://www.cnblogs.com/mrbug/archive/2018/01/24/8326162.html
-Advertisement-
Play Games

我們先回憶下之前所學的進位轉換的知識(詳見:第十章),10進位轉其它進位的方法是: 整數部份,除基取餘,逆序排列 小數部份,乘基取整,順序排列 負數,按絕對值處理 好,假設我們需要轉化的數都是正整數,那這個函數可以這樣寫: 添加調用函數的代碼: 運行代碼,分別輸入100回車、26回車,程式輸出: 通 ...


我們先回憶下之前所學的進位轉換的知識(詳見:第十章),10進位轉其它進位的方法是:

  • 整數部分,除基取餘,逆序排列
  • 小數部分,乘基取整,順序排列
  • 負數,按絕對值處理

 

好,假設我們需要轉化的數都是正整數,那這個函數可以這樣寫:

def Convert1(num:'十進位的數', base:'轉換為這個進位的數')->'轉化之後的數':

    # 0〜36的數的表示
    index = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L',
             'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

    res = ""  # 用來存儲結果

    while num >= base:
        num1 = num // base  #
        num2 = num % base  # 餘數
        num = num1
        res = str(index[num2]) + res
    else:
        res = str(num) + res

    return res

 添加調用函數的代碼:

def Convert1(num:'十進位的數', base:'轉換為這個進位的數')->'轉化之後的數':

    # 0〜36的數的表示
    index = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L',
             'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

    res = ""  # 用來存儲結果

    while num >= base:
        num1 = num // base  #
        num2 = num % base  # 餘數
        num = num1
        res = str(index[num2]) + res
    else:
        res = str(num) + res

    return res



num = input('請輸入一個十進位數,並按回車:')  # 十進位數
num = int(num)

base = input('請輸入一個2 ~ 36的數字表示進位,並按回車:')  # 轉化為這個進位
base = int(base)

print(Convert1(num, base))

運行代碼,分別輸入100回車、26回車,程式輸出:

請輸入一個十進位數,並按回車:100
請輸入一個2 ~ 36的數字表示進位,並按回車:26
3M

通過線上驗證工具:http://tool.oschina.net/hexconvert/  驗證正確。

 

現在,假設我們需要轉化的數都是 0〜1 之間的小數:

def Convert2(num:'0到1之間的十進位的數', base:'轉換為這個進位的數')->'轉化之後的數':

    # 0〜36的數的表示
    index = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L',
             'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

    res = "0."  # 用來存儲結果

    while (num < 1) & (num >0):
        num1 = num * base  #
        num2 = int(num1 // 1)  # 取整

        num = num1 - num2
        res += str(index[num2])

        if len(res) >10:  # 只保留8位
            break

    return res



num = input('請輸入一個十進位數,並按回車:')  # 十進位數
num = float(num)

base = input('請輸入一個2 ~ 36的數字表示進位,並按回車:')  # 轉化為這個進位
base = int(base)

print(Convert2(num, base))

思考:假如在while中不做位數判斷會出現什麼情況?

 

接下來我們只要把整數部分和小數部分的組合起來,就可以得到最終的函數:

def Convert1(num:'十進位的數', base:'轉換為這個進位的數')->'轉化之後的數':

    # 0〜36的數的表示
    index = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L',
             'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

    res = ""  # 用來存儲結果

    while num >= base:
        num1 = num // base  #
        num2 = num % base  # 餘數
        num = num1
        res = str(index[num2]) + res
    else:
        res = str(num) + res

    return res


def Convert2(num:'0到1之間的十進位的數', base:'轉換為這個進位的數')->'轉化之後的數':

    # 0〜36的數的表示
    index = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", 'F', 'G', 'H', 'I', 'J', 'K', 'L',
             'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

    res = "."  # 用來存儲結果 , 沒合併時這裡是 0. 想一想現在為什麼要改成 .

    while (num < 1) & (num >0):
        num1 = num * base  #
        num2 = int(num1 // 1)  # 取整

        num = num1 - num2
        res += str(index[num2])

        if len(res) >10:  # 只保留8位
            break

    return res


def Convert(num, base):
    """
    :param num:十進位數
    :param base: 要轉換為這個進位
    :return: 返迴轉換後的數
    """
    numConvert = abs(num)  # 得到num的絕對值

    num1 = int(numConvert // 1)  # 得到整數部分
    num2 = numConvert - num1  # 得到小數部分

    if num2 == 0:
        res = Convert1(num1, base)
    else:
        res = Convert1(num1, base) + Convert2(num2, base)

    return res



# 調用函數
num = input('請輸入一個十進位數,並按回車:')  # 十進位數
num = float(num)

base = input('請輸入一個2 ~ 36的數字表示進位,並按回車:')  # 轉化為這個進位
base = int(base)

print(Convert(num, base))

 

至此,函數就寫好了,但是我們發現,這個函數並不完美,因為,我們必須保證輸入的10進位數字是正確的,否則函數會報錯,請思考:如何用前些章學過的知識改進函數,使用當用戶輸入不正確的格式時提示用戶重新輸入? 後面的章節里,我們再來講如何處理這種情況。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 虛擬化和容器化是項目雲化不可避免的兩個問題。虛擬化由於是純平臺操作,一個運行於linux操作系統的項目幾乎不需要做任何改造就可以支持虛擬化。而項目如果要支持容器化則需要做許多細緻的改造工作。容器化相對於虛擬化的優勢也相當明顯,運行於裸機性能高,秒級啟停容器,更不用說開發、測試、佈署一致的環境(Dev... ...
  • 接著上一篇的內容,我們繼續來梳理分散式系統之中的副本機制與副本一致。上文我們聊到了在可用性與一致性之間的一個折中的一致性等級: 最終一致性 。我們順著上篇的內容,由用戶來分析一致性等級。 1. 客戶端的困擾 上篇文章我們提到了數據系統常用的模型,當提交新數據時,必須將它發送給Leader節點,但是當 ...
  • 本篇將介紹python中sys, getopt模塊處理命令行參數 本篇將介紹python中sys, getopt模塊處理命令行參數 如果想對python腳本傳參數,python中對應的argc, argv(c語言的命令行參數)是什麼呢?需要模塊:sys參數個數:len(sys.argv)腳本名: s ...
  • 如果你在使用 Pandas(Python Data Analysis Library) 的話,下麵介紹的對你一定會有幫助的。 如果你在使用 Pandas(Python Data Analysis Library) 的話,下麵介紹的對你一定會有幫助的。 如果你在使用 Pandas(Python Dat ...
  • 思路 上一篇大概梳理了一下 GatewayWorker 的基礎知識。這篇就來準備整合 GatewayWorker 到 Laravel。 GatewayWorker 是基於 Socket 監聽的伺服器框架,而 Laravel 是基於 HTTP 請求/響應模型的 Web 框架。所以一定要明白,兩者的部署 ...
  • 前言 本文的目的是基於 GatewayWorker 官方手冊,梳理一次 GatewayWorker,併在實踐中與 MVC 框架整合的思路(附最終的項目源碼)。如果你已經理解了整合這一塊兒的知識,那麼就可以關掉這個網頁了。時間蠻寶貴的~ 很久以前就想做一個聊天室了。百度了下 "php 通信",看到了可 ...
  • 最近有朋友問我C++(or C)怎麼入門,其實這個還真不是很好回答的,想了下就寫下這篇博文以說下我自己的學習路程吧! 正兒八經的,其實我覺得自己也學得不咋地,不管是C還是C++都是如此的強大,要真正的說精通C++的,我覺得至少得花好幾年的時間吧。我是大學裡邊才接觸到電腦語言的(現大二),學校課程安 ...
  • http://www.cnblogs.com/hthuang/p/3460234.html 5、Java-Swing常用佈局管理器 應用佈局管理器都屬於相對佈局,各組件位置可隨界面大小而相應改變,不變的只是其相對位置,佈局管理器比較難以控制,一般只在界面大小需要改是才用,但即使這樣,為了操作方便,也 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...