这题刚开始的时候我直接转化,用整形输出结果错了,即使是longlong也过不了,结果发现这道题得用字符串来输出。
因为我c++才刚学,所以在找题解找资料的过程中也学到了很多东西,感觉很赚,哼哼!
然后就打算写个题解来记录一下自己学到的东西。
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
string sixth[11];
cin>>n;
cin.ignore();
for(int i;i<n;i++)
getline(cin,sixth[i]);
string Hexs[16]={"0","1","2","3","4","5","6","7",
"8","9","A","B","C","D","E","F"};
string Bins[16]={"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
string Octs[8] = {"0", "1", "2", "3", "4", "5", "6", "7"};
for(int i=0;i<n;i++)
{
string Bin_num;
int len=sixth[i].size();
for(int j=0;j<len;j++)
{
char x=sixth[i].at(j);
string Bin;
if(x>='A'&&x<='F'){
Bin=Bins[x-'A'+10];
}
else Bin=Bins[x-'0'];
Bin_num.append(Bin);
}
len=Bin_num.size();
if(len%3==1){
Bin_num="00"+Bin_num;
}
if(len%3==2){
Bin_num="0"+Bin_num;
}
len=Bin_num.size();
string Oct_num;
for(int k=0;k<len;k+=3)
{
string a=Bin_num.substr(k,3);
int m =2;
int sum=0;
for(int i=0;m>=0;m--,i++)
sum+=pow(2.0,m)*(a[i]-'0');
char c_sum[2];
itoa(sum,c_sum,10);
Oct_num.append(c_sum);
}
if(Oct_num[0]=='0')
Oct_num.erase(Oct_num.begin());
cout<<Oct_num<<endl;
}
}
整体思路:
先把16进制用字符串的形式输入,然后根据2进制表,开一个新的字符串数组Bin_num,用append依次追加16进制数每一位转化成2进制的结果,然后用substr三个三个的截取Bin_num中的二进制字符串,在转换成8进制,最后去除前导0(一开始我一直想不通为什么只去除开头的一个0,结果想了想发现最多也只有一个前导0)。