蓝桥杯- 基础练习 十六进制转八进制

  基础练习 十六进制转八进制  
时间限制:1.0s   内存限制:512.0MB
   
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

   【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

   提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

    思路:十六进制->二进制->八进制
    遇到的坑:1.没有考虑到当十六进制数是0时,哇,必须特殊判断,若flag=0,即都是0时,结果是0;2.数组越界情况 3.剩余二进制数的判断

#include<cstdio> 
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
char str[500005],str1[500005],str2[500005];//数组越界情况
int main()
{
  int n;
  int num,len;
  scanf("%d",&n);
  while(n--){
  scanf("%s",str);
  len=strlen(str);
  int len1=0;
  for(int i=0;i<len;i++){
  	if(str[i]=='0'){//若为0,转换成二进制为:0000
  	 str1[len1++]='0';
	 str1[len1++]='0';
	 str1[len1++]='0';
	 str1[len1++]='0';
	}else if(str[i]=='1'){
  	 str1[len1++]='0';
	 str1[len1++]='0';
	 str1[len1++]='0';
	 str1[len1++]='1';		
	}else if(str[i]=='2'){
	 str1[len1++]='0';
	 str1[len1++]='0';
	 str1[len1++]='1';
	 str1[len1++]='0';	
	 //str1=str1+"0010";
	}else if(str[i]=='3'){
	 str1[len1++]='0';
	 str1[len1++]='0';
	 str1[len1++]='1';
	 str1[len1++]='1';		
	 //str1+="0011";
	}else if(str[i]=='4'){
     str1[len1++]='0';
	 str1[len1++]='1';
	 str1[len1++]='0';
	 str1[len1++]='0';
	// str1+="0100";
	}else if(str[i]=='5'){
	 str1[len1++]='0';
	 str1[len1++]='1';
	 str1[len1++]='0';
	 str1[len1++]='1';
	// str1+="0101";
	}else if(str[i]=='6'){
	 str1[len1++]='0';
	 str1[len1++]='1';
	 str1[len1++]='1';
	 str1[len1++]='0';
	// str1+="0110";
	}else if(str[i]=='7'){
	 str1[len1++]='0';
	 str1[len1++]='1';
	 str1[len1++]='1';
	 str1[len1++]='1';
	// str1+="0111";
	}else if(str[i]=='8'){
	 str1[len1++]='1';
	 str1[len1++]='0';
	 str1[len1++]='0';
	 str1[len1++]='0';
	 //str1+="1000";
	}else if(str[i]=='9'){
	 str1[len1++]='1';
	 str1[len1++]='0';
	 str1[len1++]='0';
	 str1[len1++]='1';
	// str1+="1001";
	}else if(str[i]=='A'){
	 str1[len1++]='1';
	 str1[len1++]='0';
	 str1[len1++]='1';
	 str1[len1++]='0';
	// str1+="1010";
	}else if(str[i]=='B'){
	 str1[len1++]='1';
	 str1[len1++]='0';
	 str1[len1++]='1';
	 str1[len1++]='1';
	// str1+="1011";
	}else if(str[i]=='C'){
	 str1[len1++]='1';
	 str1[len1++]='1';
	 str1[len1++]='0';
	 str1[len1++]='0';
	// str1+="1100";
	}else if(str[i]=='D'){
	 str1[len1++]='1';
	 str1[len1++]='1';
	 str1[len1++]='0';
	 str1[len1++]='1';
	// str1+="1101";
	}else if(str[i]=='E'){
	 str1[len1++]='1';
	 str1[len1++]='1';
	 str1[len1++]='1';
	 str1[len1++]='0';
	// str1+="1110";
	}else if(str[i]=='F'){
	 str1[len1++]='1';
	 str1[len1++]='1';
	 str1[len1++]='1';
	 str1[len1++]='1';
	// str1+="1111";
	}
  }  
  int len2=0,i;
  for(i=len1-1;i>=2;i=i-3){//i==2也满足条件
	 if(str1[i-2]=='0'&&str1[i-1]=='0'&&str1[i]=='1'){
	 	str2[len2++]='1'; 
	 } else if(str1[i-2]=='0'&&str1[i-1]=='1'&&str1[i]=='0'){
	 	str2[len2++]='2';
	 } else if(str1[i-2]=='0'&&str1[i-1]=='1'&&str1[i]=='1'){
	 	str2[len2++]='3';
	 } else if(str1[i-2]=='1'&&str1[i-1]=='0'&&str1[i]=='0'){
	 	str2[len2++]='4';
	 } else if(str1[i-2]=='1'&&str1[i-1]=='0'&&str1[i]=='1'){
	 	str2[len2++]='5';
	 } else if(str1[i-2]=='1'&&str1[i-1]=='1'&&str1[i]=='0'){
	 	str2[len2++]='6';
	 } else if(str1[i-2]=='1'&&str1[i-1]=='1'&&str1[i]=='1'){
	 	str2[len2++]='7';
	 }else if(str1[i-2]=='0'&&str1[i-1]=='0'&&str1[i]=='0'){
	 	str2[len2++]='0';
	 }
  }
  if(i==0){//i=3后跳出的,即还剩下0没判断
  	if(str1[0]=='0'){
  	    str2[len2++]='0';
	 }else{
	    str2[len2++]='1';	
	 }
  } else if(i==1){//i==4时跳出的,还有1,0没判断
  	 if(str1[1]=='1'&&str1[0]=='0'){
  	 	str2[len2++]='1';
	   }else if(str1[1]=='0'&&str1[0]=='1'){
	   	str2[len2++]='2';
	   }else if(str1[1]=='1'&&str1[0]=='1'){
	   	str2[len2++]='3'; 
	   }
  }
  int flag=0;
  for(int i=len2-1;i>=0;i--){
   if(str2[i]=='0'&&!flag){
   	continue;
    } 
   	printf("%c",str2[i]);
   	flag=1;
  } 
  if(flag==0){
   cout<<"0";
  }
  printf("\n");
} 
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值