C#で数値の2進数表現が回文かどうかを判定する方法
はじめに:回文(パリンドローム)とは
回文とは、前から読んでも後ろから読んでも同じになる文字列や数列のことです。本記事では、数値を2進数(バイナリ)で表現したときに、それが回文になっているかどうかをC#で判定する方法を解説します。
例として、数値「5」を考えてみましょう。5の2進数表現は次のとおりです。
101
「101」はビットを反転しても「101」のまま変わらないため、回文であることがわかります。この判定を行うには、ビットを逆順に並べ替える関数を実装します。ここでは、ビット単位の左シフト演算子(<<)と右シフト演算子(>>)を使用します。
ビットを反転する関数 funcReverse()
以下の funcReverse() 関数は、数値のビットを逆順に並べ替えます。右シフトで最下位ビットを1つずつ取り出しながら、左シフトで新しい値を作り上げていく仕組みです。
public static long funcReverse(long num) {
long myRev = 0;
while (num > 0) {
myRev <<= 1;
if ((num & 1) == 1)
myRev ^= 1;
num >>= 1;
}
return myRev;
}回文判定のロジック checkPalindrome()
次に、元の数値と funcReverse() が返す反転後の値を比較します。両者が一致すれば、その数値の2進数表現は回文だと言えます。
public static bool checkPalindrome(long num) {
long myRev = funcReverse(num);
return (num == myRev);
}サンプルコード(完全なプログラム)
以下は、数値の2進数表現が回文かどうかを確認する完全なC#プログラムです。
using System;
public class Demo {
public static long funcReverse(long num) {
long myRev = 0;
while (num > 0) {
myRev <<= 1;
if ((num & 1) == 1)
myRev ^= 1;
num >>= 1;
}
return myRev;
}
public static bool checkPalindrome(long num) {
long myRev = funcReverse(num);
return (num == myRev);
}
public static void Main() {
// 5の2進数表現は101
long num = 5;
if (checkPalindrome(num))
Console.WriteLine("Palindrome Number");
else
Console.WriteLine("Not a Palindrome Number");
}
}実行結果
Palindrome Number
処理の流れをステップごとに解説
このプログラムがどのように動作するのか、数値「5」(2進数:101)を例に順を追って見ていきましょう。
- 1周目: 最下位ビット「1」を取り出し、myRev を左シフトして追加 → myRev = 1(2進数)
- 2周目: 次のビット「0」を取り出し、myRev を左シフトして追加 → myRev = 10(2進数)
- 3周目: 最上位ビット「1」を取り出し、myRev を左シフトして追加 → myRev = 101(2進数)
ループ終了後、myRev は元の数値と同じ「101」となり、両者は一致します。そのため、コンソールには「Palindrome Number」が出力されます。
計算量について
このアルゴリズムの計算量は、ビット数に比例する O(log n) です。数値が大きくなっても処理は高速であり、実用上も十分なパフォーマンスを得られます。
まとめ
ビットシフト演算子を組み合わせることで、余分な文字列変換なしに効率的にビット反転を行い、2進数表現の回文判定が実装できます。なお、9(2進数:1001)や15(2進数:1111)なども回文となる代表的な数値の例です。ぜひ、さまざまな数値で試してみてください。
-
【C言語】再帰を使って配列が回文かどうかを判定するプログラム
配列 arr[n](n は配列のサイズ)が与えられたとき、再帰を用いてその配列が回文かどうかを判定するのが本記事のテーマです。回文とは、前から読んでも後ろから読んでも同じになる並びのことで、「MADAM」や「NAMAN」などが代表的な例です。配列が回文かどうかを調べるには、先頭と末尾から順に要素を比較していきます。再帰的なアプローチでも同様に、start と end の値を更新しながら比較を続けます。start と end が交差(すれ違う)すれば回文と判定でき、途中で要素が一致しなかった場合はそこで処理を打ち切り、false を返します。入力例と出力例入力: arr[] = { 2, 3,
-
C言語で配列が回文かどうかを判定するプログラム
回文とは任意のサイズ n の配列 arr[] が与えられたとき、その配列が回文(パリンドローム)かどうかを判定するのが本記事の目的です。回文とは、前から読んでも後ろから読んでも同じになる並びのことで、MADAM や NAMAN といった文字列が代表的な例として挙げられます。配列が回文かどうかを確認するには、配列を先頭からと末尾から同時に走査し、対応する要素同士を比較していきます。入力例と出力例Input: arr[] = {1, 0, 0, 1} Output: 配列は回文です Input: arr[] = {1, 2, 3, 4, 5} Output: 配列は回文ではありません考え方(アプ