蓝桥杯基础练习-进制转换(十六进制转八进制+十六进制转十进制+十进制转十六进制)
程序员文章站
2024-03-15 08:43:23
...
蓝桥杯基础练习-进制转换(十六进制转八进制+十六进制转十进制+十进制转十六进制)
一、十六进制转八进制
试题 基础练习 十六进制转八进制
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
AC代码:
#include<bits/stdc++.h>
using namespace std;
string a[16]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
string tran(char x)
{
string cnt="";
switch (x)
{
case '0':cnt+=a[0];break;
case '1':cnt+=a[1];break;
case '2':cnt+=a[2];break;
case '3':cnt+=a[3];break;
case '4':cnt+=a[4];break;
case '5':cnt+=a[5];break;
case '6':cnt+=a[6];break;
case '7':cnt+=a[7];break;
case '8':cnt+=a[8];break;
case '9':cnt+=a[9];break;
case 'A':cnt+=a[10];break;
case 'B':cnt+=a[11];break;
case 'C':cnt+=a[12];break;
case 'D':cnt+=a[13];break;
case 'E':cnt+=a[14];break;
case 'F':cnt+=a[15];break;
default:break;
}
return cnt;
}
int main(){
int n;
cin>>n;
string str[11];
for(int i=0;i<n;i++)
{
cin>>str[i];
string ans=""; //存放二进制字符串
int len=str[i].length();
for(int j=0;j<len;j++)
{
ans+=tran(str[i][j]);
}
int len2=ans.length();
if(len2%3==1)
{
ans="00"+ans;
}
else if(len2%3==2)
{
ans="0"+ans;
}
len2=ans.length();
string cnt=""; //存放八进制字符串
for(int j=0;j<len2;j+=3)
{
int k=(ans[j]-'0')*pow(2,2)+(ans[j+1]-'0')*pow(2,1)+(ans[j+2]-'0')*pow(2,0);
cnt+=(k+'0');
}
cnt.erase(0,cnt.find_first_not_of('0'));
cout<<cnt<<endl;
}
system("pause");
return 0;
}
二、十六进制转十进制
试题 基础练习 十六进制转十进制
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
AC代码:
#include<bits/stdc++.h>
using namespace std;
int tran(char x)
{
int ans=0;
switch(x)
{
case '0':ans=0;break;
case '1':ans=1;break;
case '2':ans=2;break;
case '3':ans=3;break;
case '4':ans=4;break;
case '5':ans=5;break;
case '6':ans=6;break;
case '7':ans=7;break;
case '8':ans=8;break;
case '9':ans=9;break;
case 'A':ans=10;break;
case 'B':ans=11;break;
case 'C':ans=12;break;
case 'D':ans=13;break;
case 'E':ans=14;break;
case 'F':ans=15;break;
}
return ans;
}
int main(){
string str;
int a[100]={0};
cin>>str;
int len=str.length();
long long int sum=0;
for(int i=len-1;i>=0;i--)
{
sum+=tran(str[i])*pow(16,len-i-1);
}
cout<<sum<<endl;
system("pause");
return 0;
}
三、十进制转十六进制
试题 基础练习 十进制转十六进制
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
给出一个非负整数,将它表示成十六进制的形式。
输入格式
输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输出格式
输出这个整数的16进制表示
样例输入
30
样例输出
1E
AC代码:
#include<bits/stdc++.h>
using namespace std;
char a[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int main(){
long long int n;
cin>>n;
long long int t=abs(n);
string str="";
if(t==0)
{
cout<<"0"<<endl;return 0;
}
while(t!=0)
{
int k=t%16;
str=a[k]+str;
t/=16;
}
cout<<str<<endl;
//system("pause");
return 0;
}
上一篇: 216.组合总数3
下一篇: C# string 判断字符串是否是中文