问题描述
问题描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有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进制表示
测评结果
代码
#include <iostream>
using namespace std;
int main()
{
int a;
cin>>a;
int yu=a%16;
int shang=a/16;
char result[200];
int count=0;
while(shang!=0) //商大于等于0,也就是这个数比16大,17是‘11’(16进制)
{
switch(yu)
{
case 0: result[count]='0';break;
case 1: result[count]='1';break;
case 2: result[count]='2';break;
case 3: result[count]='3';break;
case 4: result[count]='4';break;
case 5: result[count]='5';break;
case 6: result[count]='6';break;
case 7: result[count]='7';break;
case 8: result[count]='8';break;
case 9: result[count]='9';break;
case 10: result[count]='A';break;
case 11: result[count]='B';break;
case 12: result[count]='C';break;
case 13: result[count]='D';break;
case 14: result[count]='E';break;
case 15: result[count]='F';break;
}
count++;
yu=shang%16;//余数
shang=shang/16;
}
if(shang==0)
{
switch(yu)
{
case 0: result[count]='0';break;
case 1: result[count]='1';break;
case 2: result[count]='2';break;
case 3: result[count]='3';break;
case 4: result[count]='4';break;
case 5: result[count]='5';break;
case 6: result[count]='6';break;
case 7: result[count]='7';break;
case 8: result[count]='8';break;
case 9: result[count]='9';break;
case 10: result[count]='A';break;
case 11: result[count]='B';break;
case 12: result[count]='C';break;
case 13: result[count]='D';break;
case 14: result[count]='E';break;
case 15: result[count]='F';break;
}
}
for(int i=count;i>=0;i--)
{
cout<<result[i];
}
}
注意
这个题想了一晚上+一上午……手算感觉很简单的东西,没想到用程序实现这么难。
- 第一点,搞清楚十进制转十六进制的算法,搞清楚余数和商到底是谁除以16。这篇文章比较简洁:10进制转化为16进制的算法。
- 算法主要的思想就是:将输入的数字除 16 取余数得最低1位(个位),存入数组中,然后把商继续除 16 ,得到倒数第2位(十位),存入数组,直到商等于 0 ,将此时的余数存入数组中,再把数组倒序输出。举个例子:输入的数是 18 ,首先 18 除以 16 ,商 1 余 2 ,把余数 2 存入数组第 0 位,再用商 1 除以 16 ,商 0 余 1 ,把余数 1 存入数组第 1 位。然后倒序输出数组,得到“12”为进制转换结果。
- 第二点,在使用
switch
语句的时候,一定要加break
语句,否则会出错。 - 第三点,第一个
for
循环里面的如下代码顺序很重要。不能先把商除以 16 再算余数,否则计算出来的结果是下一轮的余数,会出错。
yu=shang%16;//余数
shang=shang/16;
- 第四点,要记得考虑输入数字小于 16 的情况。
- 最后,我的代码还是有点累赘,有的地方很不必要。搞清楚算法以后要学习怎么准确地写出代码。
参考文章
蓝桥杯 基础训练—十进制转十六进制 多种方法! 十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号
参考了这篇文章的 case
语句,开始写的程序在数字小于 10 的时候,在数组里直接插入了余数,插入的是 int
型,导致输出的不对。应该像这篇文章一样插入字符。该文章里的部分代码如下:
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int n; //输入的十进制数
int yu[200]; //用来存放余数
int lenyu = 0; //余数数组的长度
char num[200];
scanf("%d",&n);
if(n==0)
{
yu[0]==0;
lenyu++;
}
else
{
for(int i = 0; n > 0; i++ )
{
yu[i]=n%16;
n=n/16;
lenyu++;
}
}
for(int j=0;j<lenyu;j++)
{
switch(yu[j])
{
case 0:num[j]='0';break;
case 1:num[j]='1';break;
case 2:num[j]='2';break;
case 3:num[j]='3';break;
case 4:num[j]='4';break;
case 5:num[j]='5';break;
case 6:num[j]='6';break;
case 7:num[j]='7';break;
case 8:num[j]='8';break;
case 9:num[j]='9';break;
case 10:num[j]='A';break;
case 11:num[j]='B';break;
case 12:num[j]='C';break;
case 13:num[j]='D';break;
case 14:num[j]='E';break;
case 15:num[j]='F';break;
}
}
for(int i =lenyu -1; i>=0; i--)
printf("%c",num[i]);
return 0;
}