十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
题解
解题操之过急,未把各种情况考虑清楚,修改了很久,希望不要再这样。
#include <iostream> #include <cstdio> #include <stdio.h> #include <vector> #include <algorithm> #include <stdlib.h> #include <string.h> #include <cmath> #include <string> #include <fstream> using namespace std; int main(){ int n; string str[10]; scanf("%d",&n); for(int i=0;i<n;i++){ cin>>str[i]; string bin; string oct; for(int j=0;j<str[i].length();j++){ switch(str[i][j]){ case '0':bin+="0000";break; case '1':bin+="0001";break; case '2':bin+="0010";break; case '3':bin+="0011";break; case '4':bin+="0100";break; case '5':bin+="0101";break; case '6':bin+="0110";break; case '7':bin+="0111";break; case '8':bin+="1000";break; case '9':bin+="1001";break; case 'A':bin+="1010";break; case 'B':bin+="1011";break; case 'C':bin+="1100";break; case 'D':bin+="1101";break; case 'E':bin+="1110";break; case 'F':bin+="1111";break; } } int leng = bin.length() % 3; if(leng != 0){ string t = bin.substr(0,leng); if(t == "1") oct += "1"; else if (t == "10") oct += "2"; else if (t == "11") oct += "3"; else if(t=="01") oct += "1"; } if(bin.substr(leng,3) == "000") leng+=3; for(long long j = leng;j<bin.length();j+=3){ string t = bin.substr(j,3); if(t == "000") oct += "0"; else if (t == "001") oct += "1"; else if(t == "010") oct += "2"; else if(t =="011") oct += "3"; else if(t =="100") oct += "4"; else if(t =="101") oct += "5"; else if(t == "110") oct += "6"; else if(t== "111") oct += "7"; } cout<<oct<<endl; } return 0; }