资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
开始没注意题目,用了10进制当中介,但int 型 最大并不能满足 长度100000的需求;
而后改变思路,转用二进制并且使用string来实现,多说无益,多实践,来看代码吧!
#include<stdio.h>
#include<iostream>
#include<vector>
#include<stdlib.h>
#include<string>
#include<math.h>
using namespace std;
string ToChangeBin(string str,vector<string> binList){ //十六转二
if(str.at(0)=='0') return "";
string bin;
const char *m = str.data();
for(int i = 0;i <= str.length()-1;i++){
if(str.at(i)=='0') bin.append(binList.at(0));
if(str.at(i)=='1') bin.append(binList.at(1));
if(str.at(i)=='2') bin.append(binList.at(2));
if(str.at(i)=='3') bin.append(binList.at(3));
if(str.at(i)=='4') bin.append(binList.at(4));
if(str.at(i)=='5') bin.append(binList.at(5));
if(str.at(i)=='6') bin.append(binList.at(6));
if(str.at(i)=='7') bin.append(binList.at(7));
if(str.at(i)=='8') bin.append(binList.at(8));
if(str.at(i)=='9') bin.append(binList.at(9));
if(str.at(i)=='A') bin.append(binList.at(10));
if(str.at(i)=='B') bin.append(binList.at(11));
if(str.at(i)=='C') bin.append(binList.at(12));
if(str.at(i)=='D') bin.append(binList.at(13));
if(str.at(i)=='E') bin.append(binList.at(14));
if(str.at(i)=='F') bin.append(binList.at(15));
}
return bin;
}
string splitBin(string str){ //对二进制串进行切片使其满足 长度mod3 == 0
string newBin;
int len = str.length()-1; //下标
//cout<<len<<endl;
int p = 0;
if((len+1)%3 == 0){
if(str.at(0) =='0' && str.at(1) =='0' && str.at(2) =='0')
newBin.append(str.substr(3,len));
else{
newBin.append(str);
}
return newBin;
}
int t = (len+1)%3;
//cout<<t<<endl;
switch(t){
case 1:
if(str.at(0) =='0'){
newBin.append(str.substr(t,len-t+1));
}
if(str.at(0) =='1'){
newBin.append("00");
newBin.append(str);
}
break;
case 2:
if(str.at(0) =='0' && str.at(1) =='0'){
newBin.append(str.substr(t,len-t+1));
}
if(str.at(0) =='0' && str.at(1) =='1'){
newBin.append("0");
newBin.append(str);
}
if(str.at(0) =='1' && str.at(1) =='0'){
newBin.append("0");
newBin.append(str);
}
if(str.at(0) =='1' && str.at(1) =='1'){
newBin.append("0");
newBin.append(str);
}
break;
}
return newBin;
}
string ToChange8(string str,vector<string> octList){ //二 转 八
string oct;
int len = str.length()-1;
int p = 0;
//cout<<str.length()<<endl;
//cout<<str<<endl;
if(str.length()%3==0){
for(int j = 0;j <=len;j++){
if(p <=len) {
string temp = str.substr(p,3);
if(temp.compare("000")==0) oct.append(octList.at(0));
if(temp.compare("001")==0) oct.append(octList.at(1));
if(temp.compare("010")==0) oct.append(octList.at(2));
if(temp.compare("011")==0) oct.append(octList.at(3));
if(temp.compare("100")==0) oct.append(octList.at(4));
if(temp.compare("101")==0) oct.append(octList.at(5));
if(temp.compare("110")==0) oct.append(octList.at(6));
if(temp.compare("111")==0) oct.append(octList.at(7));
p += 3;
// cout<<temp<<",";
}
}
}
return oct;
}
int main(){
int n=3;
vector<string> str;
scanf("%d ",&n);
for(int i = 0;i<n;i++){
string x;
getline(cin,x);
str.push_back(x);
}
//vector<string> BinaryList {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
//vector<string> octList {"0","1","2","3","4","5","6","7"};
vector<string> BinaryList;
BinaryList.push_back("0000");
BinaryList.push_back("0001");
BinaryList.push_back("0010");
BinaryList.push_back("0011");
BinaryList.push_back("0100");
BinaryList.push_back("0101");
BinaryList.push_back("0110");
BinaryList.push_back("0111");
BinaryList.push_back("1000");
BinaryList.push_back("1001");
BinaryList.push_back("1010");
BinaryList.push_back("1011");
BinaryList.push_back("1100");
BinaryList.push_back("1101");
BinaryList.push_back("1110");
BinaryList.push_back("1111");
vector<string> octList;
octList.push_back("0");
octList.push_back("1");
octList.push_back("2");
octList.push_back("3");
octList.push_back("4");
octList.push_back("5");
octList.push_back("6");
octList.push_back("7");
for(int i =0;i<str.size();i++){
string t = ToChangeBin(str.at(i),BinaryList);
string newT = splitBin(t);
//cout<<t.length()<<endl;
// cout<<newT.length()<<endl;
string oct = ToChange8(newT,octList);
cout<<oct<<endl; // 输出细节要注意,不能cout<<endl<<oct;
}
return 0;
}