題目信息
問題描述
十六進制數是在程序設計時經常要使用到的一種整數的表示方式。它有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:一個成長中的程序猿,感謝大家的支持。