藍橋杯十六進位制轉八進位制
阿新 • • 發佈:2018-11-10
問題描述
給定n個十六進位制正整數,輸出它們對應的八進位制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進位制正整數。
【注意】
輸入的十六進位制數不會有前導0,比如012A。
輸出的八進位制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先將十六進位制數轉換成某進位制數,再由某進位制數轉換成八進位制。
#include<iostream> #include<cmath> #include<vector> #include<set> #include<cstring> #include<string> #include<algorithm> using namespace std; int main() { int n; string str1; string str; int k=0; int l=0; int num=0; int v; scanf("%d",&n); while(n--){ cin>>str1; str=""; for(int i=0;i<str1.length();i++){ switch(str1[i]){ case '0':str+="0000";break; case '1':str+="0001";break; case '2':str+="0010";break; case '3':str+="0011";break; case '4':str+="0100";break; case '5':str+="0101";break; case '6':str+="0110";break; case '7':str+="0111";break; case '8':str+="1000";break; case '9':str+="1001";break; case 'A':str+="1010";break; case 'B':str+="1011";break; case 'C':str+="1100";break; case 'D':str+="1101";break; case 'E':str+="1110";break; case 'F':str+="1111";break; } } if(str.length()%3==1){ str = "00"+str; }else if(str.length()%3==2){ str = "0"+str; } int flag=0; int num = 0; for(int i=0;i<str.length();i+=3){ num = (str[i]-'0')*4+(str[i+1]-'0')*2+(str[i+2]-'0'); if(num){ flag=1; } if(flag){ printf("%d",num); } } printf("\n"); } return 0; }
還是寫的比較簡單的= =,雖然借鑑了別人的思路。。。。。。