藍橋杯 基礎練習 十六進位制轉八進位制
阿新 • • 發佈:2018-12-19
基礎練習 十六進位制轉八進位制
時間限制:1.0s 記憶體限制:512.0MB
問題描述
給定n個十六進位制正整數,輸出它們對應的八進位制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進位制正整數。
【注意】
輸入的十六進位制數不會有前導0,比如012A。
輸出的八進位制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示
先將十六進位制數轉換成某進位制數,再由某進位制數轉換成八進位制。
整體思路:(1)先將所輸16進位制數轉化為2進位制數,再將2進位制數轉化為8進位制數。每4位2進位制數轉化1位16進位制數,每3位2進位制數轉化1位8進位制數。我是同過8421碼進行16->2->8的,這裡就需要牢記每個16進位制數對應的10進位制數和每個10進位制數對應的2進位制數了。詳細程式碼請看下面(2)在進行16轉2時還有一種方法是我看到別人寫的程式碼 利用switch語句 每個16進位制數直接手動轉化。例如 (左為16進位制數右為對應的2進位制數)0——0000; 1——0001;2——0010;3——0011;4——0100;5——0101;6——0110;7——0111;8——1000;9——1001;A——1010;B——1011;C——1100;D——1101;E——1110;F——1111;
#include <iostream> #include <stack> #include <string.h> #include <stdio.h> #include<math.h> using namespace std; int main() { int n,l,b[400000],c,x;//用來儲存所轉化的2進位制數 stack <int> s; char a[100000];//用來儲存輸入的16進位制數 cin>>n; while(n!=0) { l=0; scanf("%s",a); for(int i=strlen(a)-1;i>=0;i--)//將輸入的16進位制數轉化為2進位制數,這裡我先轉化成10進位制數 在轉化為2進位制數。 { if(a[i]>='A'&&a[i]<='F') x=a[i]-'A'+10;//當所輸入為A~F時,所輸入字母減去A再加上10 便是所表示的10進位制數。 else x=a[i]-48;//當輸入為0~9時直接減去48或'0'就是相應的整數。 for(int j=0;j<4;j++)//通過8421碼我們知道16進位制的每個數需用4位2進位制數表示所以進行4次迴圈。 { c=x%2; x=x/2; b[l++]=c; } } int k=-1;//k用來表示幾次冪,和間接計數位數。 int sum=0; for(int i=0;i<l;i++) { k++; sum+=b[i]*pow(2,k); if(k==2||i==l-1&&sum!=0)//再將b陣列3個3個按序分組,這裡的(i==l-1&&sum!=0)是為了判斷是否為尾元素且不滿三位並且防止輸出前導零。之前一直不通過就是這個條件寫的不對。 { k=-1; s.push(sum);//用棧儲存所轉化的8進位制。 sum=0; } } while(s.empty()!=true) { cout<<s.top(); s.pop(); } cout<<endl; n--; } return 0; }