问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意 】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示 】
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意 】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示 】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
这道题只要熟悉进制转换的规则就直接暴力膜就行了...
#include<cstdio>
#include<cstring>
char sz[100010];
char sz1[400010];
char sz2[400010];
void solvesz1(int len){
int k;
int i=0;
while(len >=0 ){
k=4;
if(sz[len] <= '9') sz[len] -= '0';
else sz[len] = sz[len]-'A'+10;
while(k>0){
sz1[i++] = sz[len]%2;
sz[len] /= 2;
k--;
}
len --;
}
}
int solvesz2(int end){
int i=0,j=0,sum=0;//sum计算三次相加结果,j为8进制位,i遍历2进制位
int key=0; //三次计数重置
int p=1; //2的倍数,每三次变1
while(i<end){
sum += p*sz1[i++];
p *= 2;
key++;
if(key==3){//三个数变一个
sz2[j++]=sum;
sum = 0;
p = 1;
key=0;
}
}
if(key!=0) sz2[j++]=sum;
//返回最后一位
return j;
}
int main(){
int n,len,len1;
int key=1;
scanf("%d",&n);
while(n-->0){
scanf("%s",sz);
if(sz[0]=='0') {
printf("0");
continue;
}
key=1;
len = strlen(sz)-1;
solvesz1(len);
// 二进制结果检验
// for(int i=0;i<4*(len+1);i++)
// printf("*%d",sz1[i]);
// printf("\n");
// 八进制检验
len1=solvesz2(4*(len+1))-1;//参数为最后一位
while(sz2[len1]==0) len1--;//去除前导0
while(len1>=0){
printf("%d",sz2[len1]);
len1--;
}
printf("\n");
}
return 0;
}