C++で数値を負の基数表現に変換する方法
はじめに
この記事では、与えられた数値を負の基数(ネガティブベース)表現に変換するC++プログラムについて解説します。
具体的には、ある整数と対応する負の基数が入力として与えられ、その数値を負の基数による等価な表現へと変換します。ここで扱う負の基数は、-2 から -10 までの範囲に限定します。
負の基数変換の仕組み
通常の進数変換と同様に、「数値を基数で割った余り」を下位の桁から順に並べることで変換を行います。ただし、負の基数で除算すると余りが負になる場合があるため、その際は次のように調整します。
- 余りに
-negBaseを加算し、余りを 0 以上の値に修正する - 同時に商に 1 を加算し、計算の整合性を保つ
例えば、9 を基数 -3 で表すと「100」となります。これは 1×(-3)² + 0×(-3)¹ + 0×(-3)⁰ = 9 が成立することを意味します。
C++による実装例
#include <bits/stdc++.h>
using namespace std;
// 整数を文字列に変換する
string convert_str(int n){
string str;
stringstream ss;
ss << n;
ss >> str;
return str;
}
// n を負の基数表現に変換する
string convert_nb(int n, int negBase){
// 0 の負基数表現は 0
if (n == 0)
return "0";
string converted = "";
while (n != 0){
// 負の基数で除算した余りを求める
int remainder = n % negBase;
n /= negBase;
// 余りが負の場合は正の値に調整する
if (remainder < 0) {
remainder += (-negBase);
n += 1;
}
// 余りを文字列に変換し、結果の先頭に連結する
converted = convert_str(remainder) + converted;
}
return converted;
}
int main() {
int n = 9;
int negBase = -3;
cout << convert_nb(n, negBase);
return 0;
}実行結果
100
まとめ
このように、剰余演算と商の調整を組み合わせることで、任意の整数を -2 から -10 の範囲の負の基数表現へと変換できます。負の基数は、符号ビットを使わずに負の数も表現できるという特徴があり、非常に興味深い概念です。ぜひ本サンプルコードを参考に、さまざまな数値や基数で試してみてください。
-
C++で解く!Nの階乗のB進表現における末尾ゼロの個数の求め方
はじめにこの記事では、与えられた数Nの階乗(N!)を基数Bで表したとき、末尾にいくつのゼロが連続するかを求める問題について詳しく解説します。問題の例入力 : N = 7、基数 = 2 出力 : 4 説明 : fact(7) = 5040(10進数)であり、2進数では「1001110110000」となるため、末尾にゼロが4個並びます。 入力 : N = 11、基数 = 5 出力 : 2 説明 : fact(11) = 39916800(10進数)であり、5進数では「40204314200」となるため、末尾にゼロが2個並びます。基数変換のおさらいまず、10進数から他の基数へ数値を変換する手順を確
-
C++で解く!Nの階乗の16進数表現における末尾のゼロの個数の求め方
この記事では、与えられた整数Nの階乗(N!)を16進数で表したとき、末尾に何個のゼロが連続するかを求める問題について詳しく解説します。 入力 : N = 7 出力 : 1 説明 : fact(7) = 5040(10進数)で、16進数では13B0となり、末尾のゼロは1個です。 入力 : N = 11 出力 : 2 説明 : fact(11) = 39916800(10進数)で、16進数では2611500となり、末尾のゼロは2個です。 10進数から16進数への変換のおさらい まず、任意の10進数を別の基数へ変換する手順をおさらいしましょう。ここでは、(5040)10 を16進数に変換する例を