1. 程式人生 > >藍橋杯題解-十進位制轉十六進位制-BASIC-10

藍橋杯題解-十進位制轉十六進位制-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

解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

+15x160),因此知道該十六進位制最高位後就可以用a/權值,得到當前位,然後a%權值,繼續進行迴圈。

程式碼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;
}

題解目錄