藍橋杯練習系統 基礎練習: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:一個成長中的程序猿,感謝大家的支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章