文章目录
前言
蓝桥杯练习系统基础题。
一、十六进制转八进制
想复杂想到大数除法去了。。。可以先把十六进制转二进制,再二进制转八进制。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<char,int>num;
long a[207];
string itos(ll x){
string res;
stringstream ss;
ss<<x;
ss>>res;
return res;
}
string x_to_b(string s){
string res="";
int i;
ll int_res=0;
int len=s.size();
for(i=0;i<=len-1;i++){
//cout<<"this is "<<s[i]<<endl;
string per;
if(s[i]=='A')per="1010";
else if(s[i]=='B')per="1011";
else if(s[i]=='C')per="1100";
else if(s[i]=='D')per="1101";
else if(s[i]=='E')per="1110";
else if(s[i]=='F')per="1111";
else if(s[i]=='0')per="0000";
else if(s[i]=='1')per="0001";
else if(s[i]=='2')per="0010";
else if(s[i]=='3')per="0011";
else if(s[i]=='4')per="0100";
else if(s[i]=='5')per="0101";
else if(s[i]=='6')per="0110";
else if(s[i]=='7')per="0111";
else if(s[i]=='8')per="1000";
else if(s[i]=='9')per="1001";
res+=per;
}
return res;
}
string b_to_o(string ds){
int i;
string res="";
int len=ds.size();
int re=len%3;
reverse(ds.begin(),ds.end());
for(i=1;i<=len/3;i++){
int l=3*(i-1);
int r=l+2;
int per=0;
for(int j=l;j<=r;j++){
int mi=j-l;
if(ds[j]!='0')per+=pow(2,mi);
}
string per_s=itos(per);
res+=per_s;
}
//RE
int per=0;
for(int j=len-re;j<=len-1;j++){
int mi=j-(len-re);
if(ds[j]!='0')per+=pow(2,mi);
}
string per_s=itos(per);
res+=per_s;
reverse(res.begin(),res.end());
return res;
}
string clear_pre_0(string s){
string res;
int i=0;
int len=s.size();
while(1){
if(s[i]=='0')i++;
else break;
}
res=s.substr(i,len-i);
return res;
}
int main(){
int n;
cin>>n;
int i;
for(i=1;i<=n;i++){
string s;
cin>>s;
string b=x_to_b(s);
//cout<<"b="<<b<<endl;
string o=b_to_o(b);
o=clear_pre_0(o);
cout<<o<<endl;
//cout<<"----------------------\n";
}
return 0;
}
二、十进制转十六进制
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int>ans;
int main(){
int a;
scanf("%d",&a);
while(1){
int re;
re=a%16;
ans.push_back(re);
a=a/16;
if(a==0)break;
}
int len=ans.size();
int i;
for(i=len-1;i>=0;i--){
if(ans[i]>=0&&ans[i]<=9){
cout<<ans[i];
}
else{
if(ans[i]==10)cout<<'A';
if(ans[i]==11)cout<<'B';
if(ans[i]==12)cout<<'C';
if(ans[i]==13)cout<<'D';
if(ans[i]==14)cout<<'E';
if(ans[i]==15)cout<<'F';
}
}
cout<<endl;
return 0;
}
三、十六进制转十进制
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[207];
string itos(ll x){
string res;
stringstream ss;
ss<<x;
ss>>res;
return res;
}
string x_to_d(string s){
string res="";
ll i;
ll sum=0;
ll len=s.size();
reverse(s.begin(),s.end());
for(i=0;i<=len-1;i++){
ll si,wi;
if(s[i]>='0'&&s[i]<='9'){
si=s[i]-'0';
}
else{
if(s[i]=='A')si=10;
else if(s[i]=='B')si=11;
else if(s[i]=='C')si=12;
else if(s[i]=='D')si=13;
else if(s[i]=='E')si=14;
else if(s[i]=='F')si=15;
}
wi=pow(16,i);
sum+=wi*si;
}
res=itos(sum);
return res;
}
int main(){
string s;
cin>>s;
s=x_to_d(s);
cout<<s<<endl;
return 0;
}
总结
练练基础。