BASIC-12十六進位轉換為八進位

2020-12-13 掌趣網絡

題目

問題描述

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

輸入格式

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

接下來n行,每行一個由09、大寫字母AF組成的字符串,表示要轉換的十六進位正整數,每個十六進位數長度不超過100000。

輸出格式

輸出n行,每行為輸入對應的八進位正整數。

【注意】

輸入的十六進位數不會有前導0,比如012A。

輸出的八進位數也不能有前導0。

樣例輸入

2

39

123ABC

樣例輸出

71

4435274

【提示】

先將十六進位數轉換成某進位數,再由某進位數轉換成八進位。

解答:

該題思路比較簡單,將輸入的若干16進位數轉換為2進位,再將每三位2進位數轉換為一個八進位數即可。需要注意的是輸出的數據首位若為0則不輸出。

但是效率是個大問題,一直「運行超時」。經過以下幾個版本的改進,終於通過了測評。

**題解一:**使用字符數組

這樣做有兩個明顯的缺點:

1、需要為字符數組分配固定空間。

2、插入、取出操作特別麻煩。

#include <iostream>using namespace std;int main(){int n=0;cin>>n;char a[10][100000]; //原數字串,16進位 char b[400000]; //2進位中轉數字串char c[300000]; //8進位目標數字串 //獲取準備轉換的n個數 for(int i=0;i<n;i++){for(int j=0;j<1000;j++){a[i][j]='\n';} cin>>a[i];}int count[10];for(int i=0;i<10;i++)count[i]=0;//轉換 for(int i=0;i<n;i++){//計算出每一個數的長度 for(int j=0;a[i][j]!='\n';j++)count[i]++;count[i]--;//轉換得到2進位數 for(int j=0;j<count[i];j++){ if(a[i][j]<='9'){b[j*4]=(a[i][j]-'0')/8+48;b[j*4+1]=((a[i][j]-'0')%8)/4+48;b[j*4+2]=((a[i][j]-'0')%4)/2+48;b[j*4+3]=((a[i][j]-'0')%2)/1+48;}else{b[j*4]=(a[i][j]-'A'+10)/8+48;b[j*4+1]=((a[i][j]-'A'+10)%8)/4+48;b[j*4+2]=((a[i][j]-'A'+10)%4)/2+48;b[j*4+3]=((a[i][j]-'A'+10)%2)/1+48;}} int y=0;if(count[i]*4%3>0)y=(count[i]*4)/3+1;else if(count[i]*4%3==0)y=(count[i]*3)/4;//轉換得到八進位數 for(int j=count[i]*4-1, m=0; m<y; j=j-3,m++) {//cout<<"轉換得到八進位"<<j<<endl;if(j/3>0)c[m] = (b[j]-'0') + (b[j-1]-'0')*2 + (b[j-2]-'0')*4+48;else if(j-1==0)c[m] = (b[j]-'0') +48;else if(j-2==0)c[m] = (b[j]-'0') + (b[j-1]-'0')*2 + 48; //cout<<"各項為:"<<b[j]<<b[j-1]<<b[j-2]<<" "<<endl;} for(int j=y-1;j>=0;j--){if(j==y-1&&c[j]==48);elsecout<<c[j];}cout<<endl;}return 0; }

;i++){>;i++){for(int>

題解二:**使用字符串String

string提供了更多便捷實用的方法(如substr()截取字符串的某段、insert()在某個位置插入一段字符串、length()獲取該字符串的長度等等),同時也避免了第一版代碼所出現的問題。

但是仍然運行超時,說明這兩個版本的代碼存在著共同的問題,那麼就肯定是進位轉換時做了太多無用的計算了——每一步我們都將ASCII碼轉換為整形數據,再用數學的方法計算出2/8進位數。

#include <iostream>#include <string>using namespace std;int main(){int n=0; //記錄輸入數據的個數 cin>>n;string sixTeen[10]; //用來記錄輸入的數據 for(int i=0;i<n;i++){cin>>sixTeen[i];}string eight;//記錄八進位數據 char eig;for(int i=0;i<n;i++){ string tow; //記錄二進位數據 //轉換為二進位 for(int j=0;j<sixTeen[i].length();j++){if(sixTeen[i][j]<='9'){int now=sixTeen[i][j]-'0'; //由字符串的ASCII碼得到數值 eig=now/8+'0';tow=tow+eig; //對數值做計算並且再轉換回ASCII碼存入字符串 eig=now%8/4+'0';tow=tow+eig; eig=now%4/2+'0';tow=tow+eig; eig=now%2+'0';tow=tow+eig; }else{int now=sixTeen[i][j]-'A'+10;eig=now/8+'0';tow=tow+eig; //對數值做計算並且再轉換回ASCII碼存入字符串 eig=now%8/4+'0';tow=tow+eig; eig=now%4/2+'0';tow=tow+eig; eig=now%2+'0';tow=tow+eig; }}//cout<<tow<<endl; //轉換為八進位//首先補齊「0」 int m=tow.length()%3;if(m==1)tow.insert(0,"00");else if(m==2)tow.insert(0,"0");//進行轉換 for(int k=0;k<tow.length()/3;k++){eig=(tow[k*3]-'0')*4+(tow[k*3+1]-'0')*2+(tow[k*3+2]);eight=eight+eig;} //輸出最終的八進位數 cout<<eight<<endl;}return 0;}

;i++){cin>

**題解三:**使用Switch語句枚舉

考慮到我們操作的對象只有字符串,16進位轉2進位只用16種情況,而2進位轉8進位也只有8種情況,所以只需要枚舉所有情況即可。這樣就可以避免坂本一、二代碼共同的問題。

#include <iostream>using namespace std;int main(){int n=0; //記錄輸入數據的個數 cin>>n;string sixTeen[10]; //用來記錄輸入的數據 for(int i=0;i<n;i++){cin>>sixTeen[i];} for(int i=0;i<n;i++){string eight;//記錄八進位數據string tow; //記錄二進位數據 char eig;//轉換為二進位 for(int j=0;j<sixTeen[i].length();j++){switch(sixTeen[i][j]){case '0':tow+="0000";break; case '1':tow+="0001";break; case '2':tow+="0010";break; case '3':tow+="0011";break; case '4':tow+="0100";break; case '5':tow+="0101";break; case '6':tow+="0110";break; case '7':tow+="0111";break; case '8':tow+="1000";break; case '9':tow+="1001";break; case 'A':tow+="1010";break; case 'B':tow+="1011";break; case 'C':tow+="1100";break; case 'D':tow+="1101";break; case 'E':tow+="1110";break; case 'F':tow+="1111";break; default:break; }}//轉換為八進位//首先補齊「0」 int m=tow.length()%3;if(m==1)tow.insert(0,"00");else if(m==2)tow.insert(0,"0");//進行轉換 if(!(tow[0]=='0'&&tow[1]=='0'&&tow[2]=='0')){eig=(tow[0]-'0')*4+(tow[1]-'0')*2+(tow[2]);eight=eight+eig;}for(int k=3;k<tow.length();k=k+3){//eig=(tow[k*3]-'0')*4+(tow[k*3+1]-'0')*2+(tow[k*3+2]);//eight=eight+eig;if(tow.substr(k,3)=="000")eight+="0";else if(tow.substr(k,3)=="001")eight+="1";else if(tow.substr(k,3)=="010")eight+="2";else if(tow.substr(k,3)=="011")eight+="3";else if(tow.substr(k,3)=="100")eight+="4"; else if(tow.substr(k,3)=="101")eight+="5"; else if(tow.substr(k,3)=="110")eight+="6"; else if(tow.substr(k,3)=="111")eight+="7"; }//輸出最終的八進位數 cout<<eight<<endl;}return 0;}

相關焦點

  • 二進位、十進位、八進位、十六進位間的相互轉換函數
    二進位、十進位、八進位、十六進位間的相互轉換函數1、輸入任意一個十進位的整數,將其分別轉換為二進位、八進位、十六進位。{int num;char a[39];//定義一個字符數組,用於存儲字符串cout<<"Entre num:"<<endl;cin>>num;cout<<"二進位
  • 關於二進位、十進位、八進位、十六進位數據轉換計算方法詳細總結
    例:①將八進位數67.35轉換為十進位三、十六進位與十進位的轉換 十六進位與八進位有很多相似之處,大家可以參照上面八進位與十進位的轉換自己試試這兩個進位之間的轉換。 即把上面對應的8變為16進行運算。二)五、 二進位與十六進位的轉換 方法:與二進位與八進位轉換相似,只不過是一位(十六)與四位(二進位)的轉換,下面具體講解 (1) 二進位轉換為十六進位
  • 十六進位和八進位
    由於當二進位數的位數很多時書寫很麻煩,因此為了減少書寫一個數字的位數,在計算機的資料中經常採用十六進位或八進位數來表示二進位數。
  • 單片機進位轉換
    十 ----> 八  10進位數轉換成8進位的方法,和轉換為2進位的方法類似,惟一變化:除數由2變成8。   來看一個例子,如何將十進位數120轉換成八進位數。十 ----> 十六   10進位數轉換成16進位的方法,和轉換為2進位的方法類似,惟一變化:除數由2變成16。
  • Python 進位轉換
    提到進位轉換這裡需要了解int()這個內置函數,大多數人都會這樣用:int(x)其目的一般是將x字符串轉化為整數,int()除了這個作用外,還可以將其他進位數轉化為十進位數,Python內置函數官方文檔
  • 如何進行進位轉換
    二、二進位與八進位之間的轉換   1、二進位轉八進位   方法為:3位二進位數按權展開相加得到1位八進位數。   三、二進位與十六進位之間的轉換   1、二進位轉十六進位   方法為:與二進位轉八進位方法近似,八進位是取三合一,十六進位是取四合一。
  • 二進位、八進位、十六進位在現實當中有什麼意義?
    二進位、八進位、十六進位是有很多實際意義的,人們生活中都用十進位,不要誤以為只有十進位才有現實意義,每個進位的出現都有偉大的歷史意義。八進位、十六進位八進位和十六進位在現實應用當中,主要是運用在電子技術、計算機編程等領域,是為了配合二進位而使用的,二進位是機器能夠識別的最直接語言,但是二進位位數太多,不方便記錄,所以一般把二進位轉化為八進位或十六進位。為什麼不直接把二進位轉化為十進位呢?
  • Java進位轉換的幾個方法
    無論是常規的10轉2、8、16進位,還是2、8、16轉10進位的方法都被封裝在Integer對象中。例如:十進位轉成十六進位: Integer.toHexString(int i) 十進位轉成八進位 Integer.toOctalString(int
  • MATLAB數據進位轉換
    MATLAB中,數據的運算、讀取和存儲過程有時會涉及到進位的轉換。不了解進位轉換方法的話會非常惱火。1、單個數據轉換比如我們想知道一個十進位數的二進位表示,來看具體的位置1還是0.這時可以用dec2bin函數。
  • 前端學習隨筆14 利用js實現十進位與二進位相互轉換
    的p標籤內// 新的需求是,轉化顯示後的二進位數為bin-bit中輸入的數字寬度,例如// dec-number為5,bin-bit為5,則轉化後數字為00101// 如果bin-bit小於轉化後的二進位本身位數,則使用原本的位數,如dec-number為5,bin-bit為2,依然輸出101,但同時在console中報個錯
  • Day7 進位的表示與轉換
    要輸入一個二進位,你要先把它轉換成二進位。用短除法算一下:結果倒著寫,也就是說十進位數 666 的二進位數是 1010011010,把它輸入 py 中。這玩意兒是個,看起來很像二進位數的十進位數。這是因為在 python 中,默認情況下認為你輸入的數都是十進位的。
  • 編輯器、進位與進位轉化
    ,也就是將十進位轉換為幾進位就除幾取餘,先得到的是餘數是低位,後得到餘數是高位。3、八進位(十六進位)轉換為二進位方法: 將每一位八進位(或十六進位)轉換為3位 (或4位)二進位。示例1: (76)8=(?)
  • 單片機C語言開發離不開它——秒懂二進位和十六進位
    單片機C語言開發離不開它--秒懂二進位和十六進位作為單片機愛好者,入門學習單片機編程一定要學會進位的基本概念,常見的有(二進位、八進位、十進位、十六進位),今天於曉超帶大家入門一下單片機C語言編程的二進位和十六進位(技術文章閱讀量慘澹,希望大家能夠點讚收藏加轉發
  • 介紹「十六進位數字符串至數值轉換」函數
    位於函數/字符串/「字符串/數值轉換」下,功能是把輸入的字符串(ASCII)通過十六進位數字再轉換成數值(10進位)。例如,當「string」(Hex display)值為62,因此,流入函數時,該值轉為b(ASCII),但是,如果「string」流入該函數前就是字符串(ASCII),比如直接流入a,則上述的轉換過程就可以避免。2:在函數中,字符串(ASCII)被當成十六進位處理,最後輸出的數值就是這個十六進位數對應的十進位數。
  • 跟我學java編程—不得不說的二進位和十六進位
    例:將一個十進位數25轉換為二進位數。 A 1 9 C例:A19C = 1010 0001 1001 11004、十六進位數轉換為十進位數同二進位數轉換十進位數相同,各位十六進位數與其對應權值的乘積之和即為與此十六進位相對應的十進位數
  • EV3關於10進位轉換2進位的詳解
    哈咯各位大家好之前突發奇想想做一個關於十進位轉化成二進位的想法,在這裡給大家講解一下。關於數字有多進位的,十進位、二進位、三進位、八進位、十六進位....等等。對我們最熟悉的莫過於十進位和二進位了,接下來給大家講解下如何實現將十進位轉化為二進位。【1】十進位我們最熟悉,我在這裡不多做解釋,只說十進位怎麼運算,例如302,可以看成從右往左以索引倒敘分別從0開始,進行注釋。
  • 二進位轉換為十進位和十進位轉換為二進位的方法
    各位小夥伴們大家好,在之前的文章中小編也介紹了關於二進位轉十進位的方法,這次小編知道了一個更簡單的方法,具體如下:比如我們要把28轉為二進位:28轉換為2進位先用2的n次方來表示28這個數,然後用2的n次方乘以1或者乘以0,相加來湊成與之相等的數,得到的1或者是0,根據這個表格,從左往右把二進位數字湊在一起,11100就是
  • 2019福建教師招聘考試:信息技術 進位轉換
    十六進位有16個數碼,分別為0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。基數:一種數制所使用數碼的個數。例如,十進位的基數為10,十六進位的基數為16。位權:一個數值中某一位上的1所表示數值的大小。例如,十進位的123,1的位權是102,2的位權是101,3的位權是100。
  • 程式設計師的情商:二進位電腦能識別,十進位人易懂,十六進位能做啥
    計算機專業的同學,在學習編程中,尤其是初學者,經常有這樣的疑問,一般人只認識十進位(520),電腦只能識別二進位(1000001001),那十六進位(208)能做什麼的?為什麼還要在中間加上一個十六進位呢,是不是多此一舉嗎?本來初學編程,對二進位就不熟悉,要花不少時間和理解來學習理解,在學個十六進位不是很多餘嗎?
  • 進位制與位值原理,不同進位怎麼轉換
    那這個十位的1代表的10,也就是說我們平常用的最多的十進位,滿10進1,借1當10,在十進位中,所有的數字為0、1、2、3、4、5、6、7、8、9。這裡有必要強調一下,數與數字是兩個概念,以十進位為例,數有無限個,數字卻只有0-9這十個數字。