ブルーブリッジカップ問題解-十進数転十六進法-BASE-10


原題アドレス:10進数から16進数へ
問題の説明
16進数は、プログラム設計時によく使われる整数の表現です.0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,Fの16シンボルで,それぞれ10進数の0から15を表す.16進数のカウント方法は満16進1であるため、10進数16は16進数で10であり、10進数の17は16進数で11であり、このように10進数の30は16進数で1 Eである.非負の整数を与え、16進数の形式で表す.
入力フォーマット
入力には、変換する数を表す非負の整数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未満であることを説明し、直接出力(例10進数の1変換16進数が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.逆思考では、16進数から10進数への移行は、16進数に重みを乗じたものである(例:1 E=1 x 161+15 x 160)ため、この16進数の最上位を知ると、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;
}

問題解決ディレクトリ