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

2021-01-08 掌趣網絡

題目

問題描述

給定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;}

相關焦點

  • 10、進位轉換:二進位、八進位、十六進位、十進位之間的轉換
    將二進位、八進位、十六進位轉換為十進位二進位、八進位和十六進位向十進位轉換都非常容易,就是「按權相加」。所謂「權」,也即「位權」。假設當前數字是 N 進位,那麼:更加通俗的理解是,假設一個多位數(由多個數字組成的數)某位上的數字是 1,那麼它所表示的數值大小就是該位的位權。
  • 二進位,八進位,十進位,十六進位轉換詳解~
    小數:0.11= 1×2^-1 + 1×2^-2 (以小數點為界逐步向右排序)        2.八進位···>十進位        轉換原則:讓八進位各位上的係數乘以對應的權,然後求其和。
  • 二進位、八進位、十進位、十六進位數的轉換方法
    有四進位十進位:有10個基數:0 ~~ 9 ,逢十進一二進位:有2 個基數:0 ~~ 1 ,逢二進一八進位:有8個基數:0 ~~ 7 ,逢八進一十六進位:有16個基數:0 ~~ 9,A,B,C,D,E,F (A=10,B=11,C=12,D=13,E=14,F=15) ,逢十六進一1、數的進位記數法N=a n-1*p n-1+a n-2*p n
  • 二進位,八進位,十進位,十六進位之間的轉換
    比如:[八進位]6166拆分成 1101拆分成 0016拆分成 110所以轉換成的二進位數字為:110001110再來十六進位到二進位:一個八進位的位拆分成一個四位的二進位數因此十進位的2456轉換為八進位結果為4630。二進位到八進位轉換 7=4+2+1 111 八進位最大的數字是7轉換成二進位剛好是111,佔3個位每三個二進位數為一組,轉成一個八進位數位,如果二進位高位不足3位時,用零填補。
  • 計算機的語言——二進位,十進位、八進位、十六進位與二進位之間的轉換
    一、進位的概念計算機中使用二進位編碼(只有0和1)表示數據,且只存在二進位。>4、十六進位表示基數:16權:16X數碼:0 ~  9,A,B,C,D,E,F註:十六進位數前兩個數字必須為 0X(十六進位標誌)例如:0X213     -0X30       +0X56      -0X12A二、進位轉換
  • 計算機基礎進位轉換(二進位、八進位、十進位、十六進位)
    圖1.十進位整數轉二進位十進位小數轉二進位十進位小數轉換成二進位小數採用 「乘2取整,順序排列」 法。具體做法是:用2乘十進位小數,可以得到積,將積的整數部分取出,再用2乘餘下的小數 部分,又得到一個積,再將積的整數部分取出,如此進行,直到積中的小數部分為零,或者達到所要求的精度為止。
  • 二進位、八進位、十進位和十六進位數之間的轉換方法
    相互轉換二進位轉換為八進位、十六進位:它們之間滿足23和24的關係,因此把要轉換的二進位從低位到高位每3位或4位一組,高位不足時在有效位前面添「0」,然後把每組二進位數轉換成八進位或十六進位即可八進位、十六進位轉換為二進位時,把上面的過程逆過來即可。例3:N=(C1B)H=(?)
  • 二進位-八進位-十進位-十六進位之間的相互轉換
    ,最近用到數字晶片74HC125,涉及到TTL-CMOLS-進位轉換,三個方面的知識,重新拿起書本,再查找資料,匯總信息如下:01:二進位-轉為-八進位//方法://每3位為一組,因為8進位數,需要3bit數據表示0~7,逢八進一;案例1:(1100 1110)2=(11 001 110)2=(316)8
  • 二進位、八進位和十六進位數之間的轉換
    (1)二進位數轉換為十六進位轉換方法與二進位數轉換為八進位類似,只不過是四位合一位。如:將10111101010.010001B轉換為十六進位。以小數點為基準,對於整數部分,從右向左,四位一組,不足四位前面補0。
  • 二進位、十進位、八進位、十六進位間的相互轉換函數
    二進位、十進位、八進位、十六進位間的相互轉換函數1、輸入任意一個十進位的整數,將其分別轉換為二進位、八進位、十六進位。{int num;char a[39];//定義一個字符數組,用於存儲字符串cout<<"Entre num:"<<endl;cin>>num;cout<<"二進位
  • 二進位、八進位、十進位與十六進位
    (0.16)8=(0.00111)2=(0. 0011 1000)2=(0.38)16訣竅:八進位直接轉換成十六進位比較費力,因此,最好先將八進位轉換成二進位,然後再轉換成十六進位。然後把第一次得到的餘數作為八進位的個位,第二次得到的餘數作為八進位的十位,依次類推,最後一次得到的小於8的商作為八進位的最高位,這樣由商+餘數組成的數字就是轉換後八進位的值(整數部分用除8取餘法); 小數部分則先乘8,然後獲得運算結果的整數部分,將結果中的小數部分再次乘8,直到小數部分為零。
  • 關於二進位、十進位、八進位、十六進位數據轉換計算方法詳細總結
    例:①將八進位數67.35轉換為十進位三、十六進位與十進位的轉換 十六進位與八進位有很多相似之處,大家可以參照上面八進位與十進位的轉換自己試試這兩個進位之間的轉換。 即把上面對應的8變為16進行運算。二)五、 二進位與十六進位的轉換 方法:與二進位與八進位轉換相似,只不過是一位(十六)與四位(二進位)的轉換,下面具體講解 (1) 二進位轉換為十六進位
  • 二進位、八進位、十進位、十六進位轉換計算方法
    進位也就是進位位,我們常用的進位包括:二進位、八進位、十進位與十六進位,它們之間區別在於數運算時是逢幾進一位。比如二進位是逢2進一位,十進位也就是我們常用的0-9是逢10進一位。
  • 數據的表示二進位八進位十進位十六進位之間的轉換
    數據的表示1.R進位轉十進位R進位轉十進位使用按權展開法二進位 10100.01 = 1x24+1x22+1x2-2七進位 604.01 = 6x72+4x70+1x7-2十進位 1227 = 1x103+2x102+2x101+7x1002.十進位轉
  • 二進位、八進位和十六進位之間轉換
    十進位是在人類社會發展過程中自然形成的,它符合人們的思維習慣,例如人類有十根手指,也有十根腳趾。進位也就是進位制。進行加法運算時逢X進一(滿X進一),進行減法運算時借一當X,這就是X進位,這種進位也就包含X個數字,基數為X。十進位有 0~9 共10個數字,基數為10,在加減法運算中,逢十進一,借一當十。
  • 二進位、八進位和十六進位之間轉換詳解
    十進位是在人類社會發展過程中自然形成的,它符合人們的思維習慣,例如人類有十根手指,也有十根腳趾。進位也就是進位制。進行加法運算時逢X進一(滿X進一),進行減法運算時借一當X,這就是X進位,這種進位也就包含X個數字,基數為X。十進位有 0~9 共10個數字,基數為10,在加減法運算中,逢十進一,借一當十。
  • 二進位與十六進位之間互相轉換
    通過上節課的學習,我們掌握了二進位與八進位互相轉換的方法(我們介紹的是421法),我們進行知識遷移,二進位數轉換成十六進位數的方法我們用
  • 6、計算機進位之二進位、十進位、十六進位之間的轉換
    4、進位之間的轉換4.1、正整數的十進位轉換二進位將一個十進位數除以二,得到的商再除以二,依此類推直到商等於一或零時為止,倒取除得的餘數,即換算為二進位數的結果4.2、二進位轉換為十進位二進位轉十進位的轉換原理:從二進位的右邊第一個數開始,每一個乘以2的n次方,n從0開始,每次遞增1。然後得出來的每個數相加即是十進位數。
  • 基礎知識 | 二進位、八進位和十六進位之間轉換詳解
    十進位是在人類社會發展過程中自然形成的,它符合人們的思維習慣,例如人類有十根手指,也有十根腳趾。進位也就是進位制。進行加法運算時逢X進一(滿X進一),進行減法運算時借一當X,這就是X進位,這種進位也就包含X個數字,基數為X。十進位有 0~9 共10個數字,基數為10,在加減法運算中,逢十進一,借一當十。
  • 進位詳解:二進位、八進位和十六進位
    十進位是在人類社會發展過程中自然形成的,它符合人們的思維習慣,例如人類有十根手指,也有十根腳趾。進位也就是進位制。進行加法運算時逢X進一(滿X進一),進行減法運算時借一當X,這就是X進位,這種進位也就包含X個數字,基數為X。十進位有 0~9 共10個數字,基數為10,在加減法運算中,逢十進一,借一當十。