BASIC-12 基礎練習 十六進位制轉八進位制 (c++)兩種解法,轉換2進位制或10進位制。
阿新 • • 發佈:2018-12-27
基礎練習 十六進位制轉八進位制
時間限制:1.0s 記憶體限制:512.0MB
錦囊1
使用二進位制。
錦囊2
先把十六進位制轉成二進位制,每位十六進位制正好轉成4位二進位制,然後再將二進位制轉成八進位制,每三個二進位制轉成一個八進位制。
問題描述
給定n個十六進位制正整數,輸出它們對應的八進位制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進位制正整數。
【注意】
輸入的十六進位制數不會有前導0,比如012A。
輸出的八進位制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先將十六進位制數轉換成某進位制數,再由某進位制數轉換成八進位制。
方法一:轉換10進位制。
#include <iostream> #include <string> #include <cstdio> using namespace std; int main(int argc, char *argv[]) { int n; cin>>n; string s[12]; for(int i=0;i<n;i++) cin>>s[i]; int sum=0; for(int i=0;i<n;i++){ sum=0; for(int j=0;j<s[i].length();j++){ char c=s[i][j]; if(s[i][j]>='0' &&s[i][j]<='9'){ sum=16*sum+(s[i][j]-'0'); }else{ sum=16*sum+(s[i][j]-'A'); } } printf("%o\n",sum); } return 0; }
方法二:轉換2進位制。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int b[1000005],Lb; int c[1000005],Lc; int main(int argc, char *argv[]) { int n; while(cin>>n){ while(n--){ char a[100005]; scanf("%s",a); int n=strlen(a); int Lb=0; for(int j=0;j<n;j++){ int num; if(a[j]>='A') num=a[j]-'A'+10; else num=a[j]-'0'; Lb+=4; int i=4; while(num){ i--; b[--Lb]=num%2; num/=2; } while(i--) b[--Lb]=0; Lb+=4; } int Lc=0; int x=Lb-Lb/3*3; int num=0; for(int i=0;i<x;i++) num=b[i]+num*2; if(num!=0){ c[Lc]=num; cout<<c[Lc]; Lc++; } num=b[x]*2*2+b[x+1]*2+b[x+2]; if(num!=0){ c[Lc]=num; cout<<c[Lc]; Lc++; } for(int i=x+3;i<Lb;i+=3){ c[Lc]=b[i]*2*2+b[i+1]*2+b[i+2]; cout<<c[Lc]; Lc++; } cout<<endl; } } return 0; }