C++で整数を16進数文字列に変換する方法
整数が与えられたとき、それを16進数の文字列に変換するアルゴリズムを設計します。負の数を扱う場合は、2の補数(two's complement)の方式を用いて処理します。
例えば、入力が 254 と -12 であれば、出力はそれぞれ「fe」と「fffffff4」になります。
解法のアルゴリズム
この問題は、以下の手順に従って解くことができます。
- num1 が 0 と等しい場合は、「0」を返します。
- num := num1 とします。
- s := 空の文字列 とします。
- num が 0 でない間、次の処理を繰り返します。
- temp := num mod 16(num を 16 で割った余り)とします。
- temp が 9 以下の場合は、temp を数値文字('0'〜'9')として s に連結します。
- それ以外の場合は、temp をアルファベット('a'〜'f')として s に連結します。
- num := num / 16 とします。
- 文字列 s を反転します。
- s を返します。
この実装のポイントは、負の数を unsigned int(u_int)にキャストしている点です。これにより、負の数は自動的に2の補数表現のビットパターンとして扱われるため、正の数と同じ除算・剰余算の処理で16進数への変換が可能になります。また、ASCIIコードでは「'0'」が48、「'a'」が97であるため、temp が 9 以下のときは「48 + temp」、10 以上のときは「87 + temp」('a' - 10 = 87)を加算することで、対応する文字を簡単に求められます。
実装例
理解を深めるために、以下のC++による実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string toHex(int num1){
if (num1 == 0)
return "0";
u_int num = num1;
string s = "";
while (num) {
int temp = num % 16;
if (temp <= 9)
s += (48 + temp);
else
s += (87 + temp);
num = num / 16;
}
reverse(s.begin(), s.end());
return s;
}
};
main(){
Solution ob;
cout << (ob.toHex(254)) << endl;
cout << (ob.toHex(-12));
}
入力
254 -12
出力
fe fffffff4
-
C++で五胞体数(ペンタトープ数)を求める方法
五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の
-
C++で16進数を10進数に変換するプログラムの作成方法
16進数が入力として与えられたとき、その16進数を10進数に変換するのが本記事のテーマです。 コンピュータにおける16進数は基数16で表現され、10進数は基数10で表現されます。10進数では0〜9の数字のみを使用しますが、16進数では0〜15までの値を扱うことができ、10以上の値はそれぞれA(10)、B(11)、C(12)、D(13)、E(14)、F(15)という英字で表されます。 16進数から10進数への変換手順 16進数を10進数に変換するには、以下の手順に従います。 右端の桁から順に数字を取り出し、0から始まるべき乗を掛けていきます。指数は「桁数 − 1」になるまで1ずつ増やします。