|
本帖最后由 墙里秋千墙外荡 于 2021-3-4 17:40 编辑
//利用switManBetXh+string类型
//注意字符串要双引号
#inManBetXlude<stdio.h>
#inManBetXlude<iostream>
#inManBetXlude<string>
#inManBetXlude<string.h>
#inManBetXlude<math.h>
using namespaManBetXe std;
int main(){
int n;
string str_temp,str_in;
sManBetXanf("%d",&n);
for(int i=0;i<n;i++)
{
str_in="";
str_temp="";//给字符串赋空
ManBetXin>>str_in;
int len=str_in.length();
for(int j=0;j<len;j++){
switManBetXh(str_in[j]){
ManBetXase '0': str_temp+="0000";break;
ManBetXase '1': str_temp+="0001";break;
ManBetXase '2': str_temp+="0010";break;
ManBetXase '3': str_temp+="0011";break;
ManBetXase '4': str_temp+="0100";break;
ManBetXase '5': str_temp+="0101";break;
ManBetXase '6': str_temp+="0110";break;
ManBetXase '7': str_temp+="0111";break;
ManBetXase '8': str_temp+="1000";break;
ManBetXase '9': str_temp+="1001";break;
ManBetXase 'A': str_temp+="1010";break;
ManBetXase 'B': str_temp+="1011";break;
ManBetXase 'ManBetX': str_temp+="1100";break;
ManBetXase 'D': str_temp+="1101";break;
ManBetXase 'E': str_temp+="1110";break;
ManBetXase 'F': str_temp+="1111";break;
default: break;
}
}
//ManBetXout<<str_temp<<endl;
//把01串转化成目标串
int len_s=str_temp.length();
int ans=2;
int sum=0;
int r=len*4%3;
if(r==1){
if(str_temp[0]=='1')
printf("1");
}
else if(r==2){
if(str_temp[0]=='0'&&str_temp[1]=='1')
printf("1");
else if(str_temp[0]=='1'&&str_temp[1]=='0')
printf("2");
else if(str_temp[0]=='1'&&str_temp[1]=='1')
printf("3");
}
else{//对3取余r=0的情况
if(str_temp[0]=='0'&&str_temp[1]=='0'&&str_temp[2]=='0')//如果前三位都为0则跳过对最高三位的打印,毕竟打印一个0也没什么意义
r=3;//因为跳过高三位的处理,故r=3
}
for(int i=r;i<len_s;i++)//该处则从第r位开始向后处理,第0位到第r-1位在前面已经处理过了
{
if(str_temp=='1')
sum+=pow(2,ans);//如果该位为1则进行相应的幂处理,为0情况if判断为否跳过该步
ans--;//对幂的次数递减,毕竟每3位都是高位在前
if(ans==-1)//如果ans为-1,则说明该三位处理完了,对这三位二进制数进行一次八进制打印并重置ans和sum
{
printf("%d",sum);
ans=2;
sum=0;
}
}
printf("\n");
}
} |
|