蓝桥杯-基础训练-16进制转8进制

问题描述
  给定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;
} 



猜你喜欢

转载自blog.csdn.net/lala__lailai/article/details/79195488