基础练习 十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
AC代码:
#include <iostream> #include<stdio.h> #include <algorithm> #include<string.h> #define ll long long using namespace std; int main() { char c; int t,x,r; char a[100005]; int b[400005]; scanf("%d",&t); while(t--) { string s=""; ///每次字符串更新 scanf("%s",a); int len=strlen(a); ///16进制的长度 for(int i=0;i<len;i++) ///变成二进制 { if(a[i]>='0' && a[i]<='9')///获取当前位的十六进制值 x=a[i]-'0'; else x=a[i]-'A'+10; for(int j=3;j>=0;j--) { r=x%2; x=x>>1; b[i*4+j]=r; } } len = len*4; r=len%3; for(int i=len-1;i>1;i=i-3) ///二进制,三位二进制变一位八进制 { x=b[i]+b[i-1]*2+b[i-2]*4; c=x+'0'; s=(c)+s; } if(r==2) ///左边位数不够则不累加 { x=b[1]+b[0]*2; c=x+'0'; s=c+s; } else if(r==1) { x=b[0]; c=x+'0'; s=c+s; } if(s[0]=='0') ///首位是0则 s=s.substr(1); ///截取当前下标到末尾 cout<<s<<"\n"; } return 0; }