开始的想法:十六转十,十转八。写的时候发现转十的时候数太大,不行。
可行的思路:十六转二,二转八。可行。
#include<iostream>
#include<string>
#include<string.h>
#include<math.h>
#include<vector>
using namespace std;
string Six;
vector<int> Two;
int Eight[200000]; //想改进一下,变成动态存储。
int main() // 带"//"的为测试代码
{
int n;
cin >> n;
while(n--)
{
cin >> Six;
int T, len = Six.size();
for(int i = 0; i < len; i++)
{//十六转二
if(Six[i] <= 'F' && Six[i] >= 'A')
T = Six[i] - 'A' + 10;
else
T = Six[i] - '0';
int A[4], k = 0;
while(k != 4)
{
A[k++] = T % 2;
T = T / 2;
} //注意01的顺序
for(int j = 3; j >= 0; j--)
Two.push_back(A[j]);
}
//for(vector<int>::iterator it = Two.begin(); it != Two.end(); it++)
// cout << *it;
//cout << "\n";
int x = 0, g = 0; //二转八
for(vector<int>::iterator it = Two.end()-1; it != Two.begin()-1; it--)
{
Eight[g] = Eight[g] + (*it) * pow(2.0,(double)x);
x++;
if(x%3 == 0) {g++; x=0;}
}
//cout << Eight[g] <<"\n";
if(Eight[g] != 0) cout << Eight[g]; //注意最前面不足三个的01
for(int i = g-1; i >= 0; i--)
cout << Eight[i];
cout << "\n";
memset(Eight,0,sizeof(Eight));
Two.clear();
Six.clear();
}
return 0;
}
顺便给个十六转十的,特别注意 16*位数(下标)
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
string Six;
int main()
{
cin >> Six;
unsigned long int T = 0;
int len = Six.size();
int j = len -1;
for(int i = 0; i < len; i++)
{//十六转十
if(Six[i] <= 'F' && Six[i] >= 'A')
T = T + (Six[i] - 'A' + 10) * pow(16.0,(double)j);
else
T = T + (Six[i] - '0') * pow(16.0,(double)j);
j--;
}
cout << T;
return 0;
}