藍橋杯題解-十進位制轉十六進位制-BASIC-10
阿新 • • 發佈:2019-01-14
原題地址:十進位制轉十六進位制
問題描述
十六進位制數是在程式設計時經常要使用到的一種整數的表示方式。它有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
解1:
設 需要轉換的數為a
1.十進位制轉十六進位制可由二進位制作為中間進位制,從而達到轉換目的,但過於麻煩,就不考慮。
2.那就直接進行十進位制除16取餘,然後逆序輸出,既然逆序輸出,就可以用遞迴實現。
3.遞迴的實現需要對改變的引數進行if判斷,a既然要除16取餘,那麼就用a的除數作為判斷條件。
4.判斷前,餘數得先拿到,因此申請個中間變數p來儲存餘數。
5.當a/=16為0時,說明a此時小於16,需直接進行輸出(例十進位制的1轉換十六進位制為1),此時終止遞迴操作,這時可以明確分析3
中的if條件為a/16後不等於0。
6.輸出時0-9正常操作,10-15可以用switch,也能先判斷餘數是否大於9,若是,便加上55,轉化為字元型輸出,本文選用後者。(ASCII碼A:65)
程式碼1:
#include"iostream"
using namespace std;
void change(int a)//該函式用來轉換進位制
{
int p;//p儲存除16取餘的值
p=a%16;//先取餘
a/=16;//再/=
if(a!=0)change(a);//然後遞迴
if(p>9)//最後輸出
{
cout<<char(p+55);
}
else cout<<p;
}
int main()
{
int a;//A-E的ASCII碼:65-69
cin>>a;
change(a);
return 0;
}
解2:
1.逆向思維,十六進位制轉十進位制便是十六進位制按位乘以權值(例:1E=1x161
程式碼2:
#include"iostream"
#include"cmath"
using namespace std;
int main()
{
int a,flag=0,p;//A-E的ASCII碼:65-69
cin>>a;
p=a;
while(p=p/16)flag++;//找到a最大能被16的幾次方整除,儲存在flag裡
for(int i=flag;i>=0;i--)
{
p=a/pow(16.0,i);
a=a%int(pow(16.0,i));
if(p>9)
{
cout<<char(p+55);
}
else cout<<p;
}
return 0;
}