ブルーブリッジカップ問題解-十進数転十六進法-BASE-10
7641 ワード
原題アドレス: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)を行う必要がある場合、再帰操作を終了すると、
コード1:
解2:
1.逆思考では、16進数から10進数への移行は、16進数に重みを乗じたものである(例:1 E=1 x 161+15 x 160)ため、この16進数の最上位を知ると、a/重み値を用いて現在のビットを得ることができ、その後a%重み値を用いて循環を継続することができる.
コード2:
問題解決ディレクトリ
問題の説明
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;
}
問題解決ディレクトリ