题目要求
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
解题过程
这个题想了很久,知道16进制就是加四位,算八进制就是提出三位来,但是我写的时候吧这个加了一个算十进制的过程,所以当输入的十六进制数特别特别大的时候,这个时候是没办法在转变为十进制数的。
这个是网上学习的代码,先记录下来吧。
#include <stdio.h>
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
typedef long long ll;
int main(){
int n;
cin>>n;
string s1[12],s2[12];
for(int i = 0;i<n;i++){
cin>>s1[i];
}
for(int i = 0;i<n;i++){
s2[i]="";
for(int j = 0;j<s1[i].length();j++){
switch (s1[i][j]) {
case '0' : s2[i] += "0000"; break;
case '1' : s2[i] += "0001"; break;
case '2' : s2[i] += "0010"; break;
case '3' : s2[i] += "0011"; break;
case '4' : s2[i] += "0100"; break;
case '5' : s2[i] += "0101"; break;
case '6' : s2[i] += "0110"; break;
case '7' : s2[i] += "0111"; break;
case '8' : s2[i] += "1000"; break;
case '9' : s2[i] += "1001"; break;
case 'A' : s2[i] += "1010"; break;
case 'B' : s2[i] += "1011"; break;
case 'C' : s2[i] += "1100"; break;
case 'D' : s2[i] += "1101"; break;
case 'E' : s2[i] += "1110"; break;
case 'F' : s2[i] += "1111"; break;
default:
break;
}
}
if(s2[i].length()%3==1) s2[i] = "00" + s2[i];
else if(s2[i].length()%3==2) s2[i] = "0" + s2[i];
int flag = 0;
for(int j = 0;j<=s2[i].length()-3;j+=3){
int num = 4*(s2[i][j]-'0')+2*(s2[i][j+1]-'0')+(s2[i][j+2]-'0');
if(num) flag = 1;
if(flag) cout<<num;
}
cout<<endl;
}
return 0;
}