n
任意の長さの整数の桁目を見つけようとしています。整数を文字列に変換し、インデックス n の文字を使用するつもりでした...
char Digit = itoa(Number).at(n);
...しかし、そのitoa
機能が標準ではないことに気付きました。これを行う他の方法はありますか?
(number/intPower(10, n))%10
関数を定義するだけintPower
です。
% 演算子と / を使用して、ループ内の整数除算を行うこともできます。(整数 n >= 0 を指定すると、n % 10 は単位桁を与え、n / 10 は単位桁を切り取ります。)
ostringstreamを使用してテキスト文字列に変換できますが、次の行に沿った関数です。
char nthDigit(unsigned v, int n)
{
while ( n > 0 ) {
v /= 10;
-- n;
}
return "0123456789"[v % 10];
}
はるかに少ない複雑さでトリックを行う必要があります。(初心者の場合、nが桁数より大きい場合を正しく処理します。)
-ジェームズ・カンゼ
直接的な答えは次のとおりです。
char Digit = 48 + ((int)(Number/pow(10,N)) % 10 );
<math>
ライブラリを含める必要があります
number = 123456789
n = 5
tmp1 = (int)(number / 10^n); // tmp1 = 12345
tmp2 = ((int)(tmp1/10))*10; // tmp2 = 12340
digit = tmp1 - tmp2; // digit = 5
イトアは stdlib.h にあります。
代替の itoa を使用することもできます:
整数を文字列に変換するための itoa() の代替 C++?
または
ANSI C、可変長関数を使用しない整数から文字列へ
関数log10、 int cmathを使用して、文字列への変換を回避することもできます。この関数は、数値の 10 を底とする対数 (文字列の場合はおおよその長さ) を返します。
unsigned int getIntLength(int x)
{
if ( x == 0 )
return 1;
else return std::log10( std::abs( x ) ) +1;
}
char getCharFromInt(int n, int x)
{
char toret = 0;
x = std::abs( x );
n = getIntLength( x ) - n -1;
for(; n >= 0; --n) {
toret = x % 10;
x /= 10;
}
return '0' + toret;
}
私はそれをテストし、完全にうまく動作します (負の数は特殊なケースです)。また、n 番目の要素を見つけるには、 int の長さの合計から減算して、ループ内を逆方向に「歩く」必要があることも考慮に入れる必要があります。
お役に立てれば。
より一般的なアプローチ:
template<int base>
int nth_digit(int value, int digit)
{
return (value / (int)pow((double)base, digit)) % base;
}
異なる基数 (たとえば、16、32、64 など) に対して同じことを実行できます。
const char digit = '0' + number.at(n);
number.at(n)
つまり、0〜9の範囲の10進数を返すと仮定します。