蓝桥杯学习记录-21.2.26
一、测试练习
十进制转十六进制
1、问题描述
资源限制
时间限制: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
2、解题思路
(1)十进制转换为十六进制,可以用不断地除以16“取余数”的方法得到,例如:
十进制 17852 转化为十六进制,
17852/16 = 1115 余 12 – c
1115/16 = 69 余 11 – b
69/16 = 4 余 5
4/16 = 0 余 4
得到十六进制45bc
(2)然后用强制转化将十六进制中的数变成字符的形式,如本题中的“a[j]=char(s[j])+48”
3、代码
#include<iostream>
#include <cstdlib>
using namespace std;
int main()
{
int n,i,j,k=0;
int s[20];
char a[20];
cin>>n;
if(n==0)
cout<<"0";
else
{
while(n!=0)
{
s[k]=n%16;
n=n/16;
k++;
}
for(j=0; j<k; j++)
{
if(s[j]==10)
a[j]='A';
else if(s[j]==11)
a[j]='B';
else if(s[j]==12)
a[j]='C';
else if(s[j]==13)
a[j]='D';
else if(s[j]==14)
a[j]='E';
else if(s[j]==15)
a[j]='F';
else
a[j]=char(s[j])+48;
}
for(i=k-1; i>=0; i--)
cout<<a[i];
}
return 0;
}
二、资源学习
1、学习名称及链接
[进制转换]
(https://zhidao.baidu.com/question/1765987632785192540.html)
2、学习心得
(1)N进制的每位上的权值都是N
(2)十六进制转换成十进制的公式是:要从右到左用二进制的每个数去乘以16的相应次方,然后这些数字相加就是了。
例如
2AF5换算成10进制:
第0位: 5 * 16^0 = 5
第1位: F * 16^1 =15*16^1= 240
第2位: A * 16^2= 10* 16^2=2560
第3位: 2 * 16^3 = 8192
结果就是:5 * 16^0 + 15 * 16^1 + 10 * 16^2 + 2 * 16^3 = 10997
3、对应练习
十六进制转十进制
(1)题目描述
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。样例输入
FFFF
样例输出
65535
(2)代码
#include<cstdio>
#include<cstring>
char str[10];
int num[10];
int main()
{
int len,i;
while(scanf("%s",str)!=EOF)
{
len=strlen(str);
__int64 sum=0;
for(i=0;i<len;++i)
{
if(str[i]=='A')
sum=sum*16+10;
else if(str[i]=='B')
sum=sum*16+11;
else if(str[i]=='C')
sum=sum*16+12;
else if(str[i]=='D')
sum=sum*16+13;
else if(str[i]=='E')
sum=sum*16+14;
else if(str[i]=='F')
sum=sum*16+15;
else
sum=sum*16+(str[i]-'0');
}
printf("%I64d\n",sum);
}
return 0;
}