蓝桥杯练习系统 基础练习:BASIC-10 十进制转十六进制

题目信息

问题描述

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

解题思路

主要考察

 本题的考察关键字为:循环整除求余判断。十进制数N转换为其他d进制是计算机实现计算的基本问题,常用的方法是除尽取余法。该算法基于原理N = (N div d) * d + N mod d,(其中:div为整除运算,mod为求余运算)。比如说十进制123转换为二进制的转换过程为:
十进制转换为二进制
我们不断地进行除2取余,由于上述计算过程是从低位到高位顺序产生2进制的各个数位,而打印输出一般都是按照从高位到低位进行,恰好与计算过程相反。本题最好的方法是用解决此问题,栈的主要用法在之前的博客已经写过了,如果对栈不熟悉可以看一看数据结构——栈的详解。当然也可以使用数组来解决,但是使用数组解决在输出方面不是特别好处理,不如使用栈方便实现。在解题的时候我们需要使用循环来实现:不断地除16取余,将结果push到栈中,将栈中的结果输出。那么这个判断考察什么呢?这个判断是考察当输入为0的时候应该输出0,如果我们不加判断输入的是否为0,那么在while循环里我们输入0之后会因为判定条件为假而无法进入循环导致没有输出,实际上应该输出0。在做这个题目的时候我就忘记判断输入的是否为0导致有一组测试样例没有通过。
流下了没技术的泪水

解题代码

#include<iostream>
#include<stack>
using namespace std;

int main(){
	char s[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	int n;
	stack<char> ch;
	cin>>n;
	
	if(n==0){
		cout<<0;
	}else{
		//使用除尽取余法将每一个数位的结果计算出并将结果入栈 
		while(n){
			ch.push(s[n%16]);
			n /= 16;
		}
		//输出结果,只要栈不为空就输出栈中的元素 
		while(!ch.empty()){
			cout<<ch.top();
			ch.pop();
		}
	}
	
	return 0;
} 

 以上就是对于本题的解题思路了,如果你觉得我的文章对你有用请点个赞支持一下吧,如果喜欢我写的文章那么请点个关注再走呦。如果此文章有错误或者有不同的见解欢迎评论或者私信。
皮一下
我是ACfun:一个成长中的程序猿,感谢大家的支持。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页