问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成二进制数,再由某进制数转换成八进制。
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n;
cin >> n;
while(n--){
string Hex, Binary;
cin >> Hex;
Binary = "";
for(int i = 0;i < Hex.length(); i++){
switch(Hex[i]) {
case '0':Binary += "0000"; break;
case '1':Binary += "0001"; break;
case '2':Binary += "0010"; break;
case '3':Binary += "0011"; break;
case '4':Binary += "0100"; break;
case '5':Binary += "0101"; break;
case '6':Binary += "0110"; break;
case '7':Binary += "0111"; break;
case '8':Binary += "1000"; break;
case '9':Binary += "1001"; break;
case 'A':Binary += "1010"; break;
case 'B':Binary += "1011"; break;
case 'C':Binary += "1100"; break;
case 'D':Binary += "1101"; break;
case 'E':Binary += "1110"; break;
case 'F':Binary += "1111"; break;
default:break;
}
}
if(Binary.length() % 3 == 1) Binary= "00" + String_Binary;
else if(Binary.length() % 3 == 2) Binary = '0' + Binary;
int Sign_Leading_Zero = 0;
for(int i = 0;i <= Binary.length() - 3; i += 3){
int Digit_Number = 4 * (Binary[i] - '0') + 2 * (Binary[i+1] - '0') + (Binary - '0');
if(Digit_Number) Sign_Leading_Zero = 1;
if(Sign_Leading_Zero) cout << Digit_Number;
}//将二进制转化为八进制
cout << endl;
}
return 0;
}
这道题可以概括所有进制转化问题,输入输出,只需要更改相应进制即可。
例如十六进制转换为十进制:
只需要将进制转换的相应值改变再稍稍改动代码即可
附上
unsigned int 0~4294967295
int -2147483648~2147483647
unsigned long 0~4294967295
long -2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
十进制 一般十进制格式 1234567890
二进制 开头加上0b 0b00001110
八进制 开头加上O O0123
十六进制 开头加上X 0xFF4