十六進位數轉換為八進位數

来源:https://www.cnblogs.com/cs-whut/archive/2022/11/23/16918919.html
-Advertisement-
Play Games

我們寫東西的時候總會遇到lua中要調用java代碼,當然這個用JNI肯定是可以做到的,但是有更加方便的辦法—LuaJavaBridge。 一、luaj 主要特征 * 可以從 Lua 調用 Java Class Static Method * 調用 Java 方法時,支持 int/float/bool ...


     【問題描述】

  給定n個十六進位正整數,輸出它們對應的八進位數。

       輸入格式

  輸入的第一行為一個正整數n (1<=n<=10)。

  接下來n行,每行一個由0~9、大寫字母A~F組成的字元串,表示要轉換的十六進位正整數,每個十六進位數長度不超過100000。輸入的十六進位數不會有前導0,比如012A。

       輸出格式

  輸出n行,每行為輸入對應的八進位正整數。輸出的八進位數也不能有前導0。

       樣例輸入

  2

  39

  123ABC

       樣例輸出

  71

  4435274

       【編程思路1】

       我們知道,二進位數與八進位數或十六進位數之間存在直接轉換關係。可以說,八或十六進位數是二進位數的縮寫形式。在電腦中,利用這一特點可把用二進位代碼表示的指令或數據寫成八或十六進位形式,以便於書寫或認讀。 

      (1)二進位整數與八進位整數的轉換。

        由於八進位的基數為8,二進位的基數為2,兩者滿足8=23,故每位八進位數可轉換為等值的三位二進位數,反之亦然。

        因此,八進位整數轉換成二進位整數,只需把每位八進位數用相應的3位二進位數代替即可。而二進位整數轉換成八進位整數,則將二進位整數從右到左分成三位一組,頭部不足三位時補0,再將每組的三位二進位數寫成一位八進位數,則得對應的八進位整數。

        (2)二進位數與十六進位數的轉換。

        由於十六進位的基數為16,二進位的基數為2,兩者滿足16=24,故每位十六進位數可轉換為等值的四位二進位數,反之亦然。

        因此,十六進位整數轉換成二進位整數,只需把每位十六進位數用相應的4位二進位數代替即可。而二進位整數轉換成十六進位整數,則將二進位整數從右到左分成四位一組,頭部不足四位時補0,然後將每組的四位二進位數寫成一位十六進位數,則得對應的十六進位整數。 

        (3)八進位整數與十六進位整數的轉換。

        可以用二進位數作為中間數制進行轉換。即若要將十六進位整數轉換為八進位整數,可以先將十六進位整數轉換為相應的二進位整數,然後再將二進位整數轉換為相應的八進位整數。

        以樣例為例,若要轉換的十六進位整數為39,轉換為二進位整數時,每個數直接用4位二進位數來替換,寫成00111001,去掉前導0,得到相應的二進位整數 為 111001。再將該二進位整數從右到左分成兩組 111  001 ,每組分別用一個八進位數位來代替,寫成 71,即對應的八進位整數為 71。

        若要轉換的十六進位整數為 123ABC,轉換為二進位整數時,每個數直接用4位二進位數來替換,寫成 0001 0010 0011 1010 1011 1100,去掉前導0,得到相應的二進位整數 為 10010001110101011 1100。再將該二進位整數從右到左分成七組 100 100 011 101 010 111 100 ,每組分別用一個八進位數位來代替,寫成 4 4 3 5 2 7 4,即對應的八進位整數為 4435274。

       按上面的方法,可以編寫如下的源程式1。

        【源程式1】

#include <stdio.h>
#include <string.h>
int main()
{
    char  hex[100001],bin[400001];
    char table[16][5]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
    int n,i,num;
    scanf("%d",&n);
    while (n--)
    {
        scanf("%s",hex);
        if (hex[0]=='0')
        {
            printf("0\n");
            continue;
        }
        bin[0]='\0';
        for (i=0;hex[i]!='\0';i++)      // 將十六進位數中的每個數字用4位二進位數替換,從而將十六進位整數轉換為對應的二進位整數 
        {
            num=hex[i]-'0';
            if (num>9) num=num-7;
            strcat(bin,table[num]);
        }
        for (i=0; bin[i]=='0';i++) ;   // 去掉二進位數的前導0
        strcpy(bin,&bin[i]);
        int len=strlen(bin);           // 將二進位整數從右到左每3位為一組
        if (len%3==0)                  // 先將頭部的一組(若為1位或2位)轉換為一個八進位數
           i=0;
        else if (len%3==1)
        {
           i=1;
           printf("1");
        }
        else
        {
           i=2;
           num=(bin[0]-'0')*2+(bin[1]-'0');
           printf("%d",num);
        }
        for (;i<len;i+=3)              // 再將後面的各組(每組均有3位),每組均轉換為一個八進位數 
        {

           num=(bin[i]-'0')*4+(bin[i+1]-'0')*2+(bin[i+2]-'0');
           printf("%d",num);
        }
        printf("\n");
    }
    return 0;
}

        【編程思路2】

        上面的源程式1可以實現十六進位整數轉換為八進位整數,但由於採用二進位數過渡時,產生的二進位數位數太多。這樣,處理起來效率不高。在有些包含這個數制轉換問題的OJ系統中,若提交類似源程式1所示的代碼,會出現“運行超時”。因此,需要採用更高效的方法來處理。

       由前面源程式1可知,一個十六進位整數的1位可以用4位二進位數來代替,而3位二進位數可以直接寫成 1位八進位數。3和4的最小公倍數為12。也就是說,十六進位整數轉換為八進位整數時,可以從右到左,將十六進位整數每3位一組,每組正好替換為12位的二進位整數,而這個12位的二進位整數轉換為八進位整數時,正好轉換為4位八進位數。因此,我們無需用二進位數作為過渡,在十六進位數轉換為八進位數時,可將十六進位整數從右到左分成三位一組,頭部不足三位時補0,然後將每組的三位十六進位數轉換為四位的八進位數,則得對應的八進位整數。在具體處理時,將這個3位十六進位數按權值展開的方式轉換為相應的十進位數,然後直接將轉換得到的十進位數按4位八進位數輸出即可。

        還是以樣例為例,若要轉換的十六進位整數為 123ABC,將該十六進位數從右到左分成兩組 123 ABC,每組分別轉換為一個10進位數,再將轉換得到的每個十進位數按八進位數輸出。其中,在輸出時,頭部一組直接按實際位數輸出,而後面的各組必須按4位輸出,不足4位時用前導0填充。這樣,123 轉換為十進位數為291,按八進位數輸出為443; ABC轉換為十進位數為 2748,按4位八進位數輸出為 5274。這樣得到轉換後的八進位數為 4435274。

        【源程式2】

#include <stdio.h>
#include <string.h>
int main()
{
    char  hex[100001];
    int n;
    scanf("%d",&n);
    while (n--)
    {
        scanf("%s",hex);
        if (hex[0]=='0')
        {
            printf("0\n");
            continue;
        }
        int i,j,len,k,num,sum;
        len=strlen(hex);
        k=len%3==0?3:len%3;    // 將十六進位數從右向左每3位一組,k表示最左一組的位數
        sum=0;
        for (i=0;i<k;i++)      // 將最左一組k位十六進位數轉換為十進位數
        {
            num=hex[i]-'0';
            if (num>9) num=num-7;
            sum=sum*16+num;
        }
        printf("%o",sum);      // 將十進位整數按八進位數輸出
        for (;i<len;i+=3)      // 將之後的十六進位數每3位一組轉換位十進位數,然後按4位八進位數輸出
        {
           sum=0;
           for (j=0;j<3;j++)
           {
                 num=hex[i+j]-'0';
                 if (num>9) num=num-7;
                 sum=sum*16+num;
           }
           printf("%04o",sum);
        }
        printf("\n");
    }
    return 0;
}

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

-Advertisement-
Play Games
更多相關文章
  • new ,delete 運算符 int *p =new int; delete p; 看一下彙編代碼 可以看到new 和delete 運算符其實也是 operator運算符重載函數的調用 malloc和new malloc 按位元組開闢記憶體 new在開闢記憶體的時候需要指定類型 new int[10] ...
  • 一.小結 1.迴圈語句有三類:while迴圈,do-while迴圈和for迴圈 2.迴圈中需要重覆執行的語句所構成的整體稱為迴圈體 3.迴圈體執行一次稱為迴圈的一次迭代 4.無限迴圈是指迴圈語句被無限次執行 5.在設計迴圈時,既需要考慮迴圈控制構體,還需要考慮迴圈體 6.while迴圈首先檢查迴圈繼 ...
  • WEB開發會話技術04 14.Session生命周期 14.1生命周期說明 public void setMaxInactiveInterval(int interval):設置session的超時時間(以秒為單位),超過指定的時長,session就會被銷毀。 值為正數的時候,設置session的超 ...
  • 遞歸與Stream流轉換 今天寫一個很久以前一直不太會的,今天花了大量的時間進行研究處理,現將代碼解析於此 list轉為類中一個屬性為key,類實例為value的Map Map<String, List<OrgTreeVo>> orgMap = orgList.stream().filter(h - ...
  • 目錄 一.OpenGL 圖像褐色 1.原始圖片 2.效果演示 二.OpenGL 圖像褐色源碼下載 三.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> ...
  • 上篇文章談到BlockingQueue的使用場景,並重點分析了ArrayBlockingQueue的實現原理,瞭解到ArrayBlockingQueue底層是基於數組實現的阻塞隊列。 但是BlockingQueue的實現類中,有一種阻塞隊列比較特殊,就是SynchronousQueue(同步移交隊... ...
  • 1、const修飾變數 被const修飾過的變數相當於常量,它的值不能被賦值改變,在整個作用域內保持固定。所以說它定義的是只讀變數,在定義的時候需要給它賦初值。 1 const int a = 1; 2 a = 2; /*錯誤,常量的值不能改變*/ 3 const int a; /*錯誤,常量定義時 ...
  • 性能檢測分析方法 - 時間、空間衡量方法 Python 自帶模塊 import time 點擊查看代碼 # 僅僅是示範 time 模塊的用法,此段不能直接運行,運行請看測試項目源碼 import time def measure_runtime(func): time_start = time.ti ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...