问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
39
123ABC
样例输出
71
4435274
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
这题首先是很大的数,不能用int ,long long得储存开始就脑残的看错了,题里说是100000位,我看成了不大于100000所以运行错误了。。。
以下是代码:
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int f16to10(char c)
{
if('0'<=c&&c<='9')return c-'0';
return c-'A'+10;
}
int f2to8(char c1,char c2,char c3){
return (c1-'0')*4+(c2-'0')*2+c3-'0';
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
char s[100025];
scanf("%s",s);
int len=strlen(s);
char s1[500000];
for(int l=0;l<len;l++)
{
int ans=f16to10(s[l]);
s1[4*l+0]=ans/8+'0';
s1[4*l+1]=ans/4%2+'0';
s1[4*l+2]=ans/2%2+'0';
s1[4*l+3]=ans%2+'0';
}
s1[4*len]='\0';
len=strlen(s1);
int q=0;
while(s1[q]=='0')
{
q++;
}
if((len-q)%3==1){cout<<f2to8('0','0',s1[q]);q++;}
if((len-q)%3==2){cout<<f2to8('0',s1[q],s1[q+1]);q+=2;}
while(q<len){
cout<<f2to8(s1[q],s1[q+1],s1[q+2]);q+=3;
}
cout<<endl;
}
return 0;
}