蓝桥杯大数十六进制转八进制

xiaoxiao2021-02-28  42

问题描述   给定n个十六进制正整数,输出它们对应的八进制数。 输入格式   输入的第一行为一个正整数n (1<=n<=10)。   接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。 输出格式   输出n行,每行为输入对应的八进制正整数。    【注意   输入的十六进制数不会有前导0,比如012A。

  输出的八进制数也不能有前导0。

样例输入   2   39   123ABC 样例输出   71

  4435274

把39转成二进制:00111001

再把该二进制转成八进制:

000,111,001=071

我把不足3位的补成了000,再把071的前导0去掉

代码:

#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<map> using namespace std; map<char,int>mp; char str16[100005]; int str2[400005],str8[400005]; int main() { //freopen("F:\浏览器下载\input1.txt", "r", stdin); //freopen("out.txt", "w", stdout); int t,i,j,k,m; int f[4]={1,2,4}; mp['A']=10;mp['B']=11;mp['C']=12;mp['D']=13;mp['E']=14;mp['F']=15; for(i=0;i<=9;i++) mp[i+'0']=i; cin>>t; while(t--){ k=0; cin>>str16; for(i=strlen(str16)-1;i>=0;i--){ m=mp[str16[i]]; //cout<<m<<endl; for(j=0;j<4;j++){ str2[k]=m%2; m/=2; k++; } } m=0;int p=0; while(k%3!=0){ str2[k++]=0; //cout<<"k="<<k<<endl; } /*for(i=k-1;i>=0;i--)cout<<str2[i]; cout<<endl;*/ for(i=0,j=0;i<k;i++){ m+=str2[i]*f[j]; //cout<<str2[i]<<" "<<f[j]<<endl; j++; if(j==3){ j=0; str8[p++]=m; //cout<<"m="<<m<<endl; m=0; } } //cout<<"p="<<p<<endl; //cout<<str8[p-1]<<endl; m=0; for(i=p-1;i>=0;i--){ if(str8[i]==0) m++; else break; } for(i=p-1-m;i>=0;i--) cout<<str8[i]; cout<<endl; } return 0; }

转载请注明原文地址: https://www.6miu.com/read-2631283.html

最新回复(0)