【蓝桥杯】 C++ 试题 基础练习 十进制转十六进制

问题描述

问题描述
  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值