十六进制转八进制(只能处理一般数据,变态数据版本稍后发)
最近写蓝桥杯的题目,有道题是将16进制转成8进制,写出来之后不通过,查看了一下题目的测试数据,我就怒了,感觉出题人很皮呀,但是辛辛苦苦写出来的代码也不是说不能用,就是对付测试数据有点。。。。。。只能说没脾气了,但是一般的数据还是能通过的,之后再将对付变态数据的代码发出来,废话不多说了,贴代码
一、代码
#include<iostream>
#include<cmath>
#include<string>
#include<vector>
using namespace std;
int toDec(string str) {
int len = str.length();
int i = 1, dec = 0;
//这里本来可以用增强for来简化代码,无奈蓝桥杯练习系统不支持
for (int j = 0; j < len; j++) { //这里是将16进制转成10进制的具体方法
if (str[j] >= '0' && str[j] <= '9') {
dec += ((str[j] - '0') * pow(16, (len - i)));
}
else if ((str[j] >= 'a' && str[j] <= 'z') || (str[j] >= 'A' && str[j] <= 'Z')) {
dec += ((str[j] - 'A' + 10) * pow(16, (len - i)));
}
i++;
}
return dec;
}
string toOct(int num) {
string s = "";
while (num != 0) { //这里是将10进制转成8进制的具体方法
string c = "";
c += ('0' + (num % 8));
s.insert(0, c);
num /= 8;
}
return s;
}
int main()
{
int n;
cin >> n; //请输入有几组数据
cin.get(); //将cin >> n后面的回车符号读取了
vector<string> vs;
string sbuf;
while (n--) { //具体的输入数据
getline(cin, sbuf);
vs.push_back(sbuf);
}
for (vector<string>::iterator it = vs.begin(); it != vs.end(); ++it) {
int ibuf = toDec(*it); //先将16进制转成10进制
*it = toOct(ibuf); //再将10进制转成8进制
cout << *it << endl; //直接输出
}
return 0;
}