例。123456 で、右から 3 番目 ('4') が必要です。
実際の考え方は、各桁に個別にアクセスすることです (つまり、6 5 4 3 2 1)。
C/C++/C# を推奨。
例。123456 で、右から 3 番目 ('4') が必要です。
実際の考え方は、各桁に個別にアクセスすることです (つまり、6 5 4 3 2 1)。
C/C++/C# を推奨。
より効率的な実装は次のようになります。
char nthdigit(int x, int n)
{
while (n--) {
x /= 10;
}
return (x % 10) + '0';
}
これにより、数字の 1 つだけが必要な場合に、すべての数字を文字列形式に変換する手間が省けます。また、変換された文字列にスペースを割り当てる必要はありません。
速度が問題になる場合は、10 の累乗の配列を事前に計算し、n を使用してこの配列にインデックスを付けることができます。
char nthdigit(int x, int n)
{
static int powersof10[] = {1, 10, 100, 1000, ...};
return ((x / powersof10[n]) % 10) + '0';
}
他の人が述べたように、これは基数 10 のビット単位の演算に到達するのと同じくらい近いです。
ここでの回答に基づいてこれを書くのに時間を費やしたので、共有したいと思いました。
これは Brannon の回答に基づいていますが、一度に複数の数字を取得できます。私の場合、数字が yyyymmddhhnnssm_s 形式である int に保存された日付と時刻から部分を抽出するために使用します。
public static int GetDigits(this int number, int highestDigit, int numDigits)
{
return (number / (int)Math.Pow(10, highestDigit - numDigits)) % (int)Math.Pow(10, numDigits);
}
私はそれを拡張機能にしました。あなたはやりたくないかもしれませんが、ここに使用例があります:
int i = 20010607;
string year = i.GetDigits(8,4).ToString();
string month = i.GetDigits(4,2).ToString();
string day = i.GetDigits(2,2).ToString();
結果:
年 = 2001
月 = 6
日 = 7
基数 10 の計算を使用します。
class Program
{
static void Main(string[] args)
{
int x = 123456;
for (int i = 1; i <= 6; i++)
{
Console.WriteLine(GetDigit(x, i));
}
}
static int GetDigit(int number, int digit)
{
return (number / (int)Math.Pow(10, digit - 1)) % 10;
}
}
プロデュース:
6
5
4
3
2
1
ビット単位の演算で (簡単に) うまくいかない理由は、10 進法 (10) の基数が 2 進法 (2) の基数の累乗ではないためです。
基数 8 でコーディングしている場合、 がありpow(2, 3) == 8
、各 8 進数を 3 ビットのブロックとして抽出できます。
そのため、実際には base 10 に変換する必要があります。これは通常、文字列に変換することによって行われます (toString (Java) または sprintf (C) を使用して、他の人が返信で示しているように)。
ここで説明されているように、これは 451069 までの unsigned int に対して機能します。
def hundreds_digit(u): return mod10(div100(u))
def div100(u): return div10(div10(u))
def mod10(u): return u - mul10(div10(u))
def mul10(u): return ((u << 2) + u) << 1
def div10(u):
Q = ((u >> 1) + u) >> 1 # Q = u*0.11
Q = ((Q >> 4) + Q) # Q = u*0.110011
Q = ((Q >> 8) + Q) >> 3 # Q = u*0.00011001100110011
return Q
# Alternatively:
# def div100(u): return (u * 0xa3d7) >> 22
# though that'd only work for 16-bit u values.
# Or you could construct shifts and adds along the lines of div10(),
# but I didn't go to the trouble.
それをテストする:
>>> hundreds_digit(123456)
4
>>> hundreds_digit(123956)
9
もっと速かったらビックリですけどね。たぶん、あなたの問題を再考する必要があります。
値 = (数値 % (10^位置)) / 10^(位置 - 1)
例:
番号 = 23846
位置 = 1 -> 値 = 6
位置 = 2 -> 値 = 4
位置 = 3 -> 値 = 8
これを行うための簡単な Objective-C ユーティリティ メソッドを次に示します。
+ (int)digitAtPosition:(int)pos of:(int)number {
return (number % ((int)pow(10, pos))) / (int)pow(10, pos - 1);
}
これはアセンブラーのアプローチである可能性があるため、ビット単位の左シフト (N-1 の場合) を試してから [0] の数字を読み取ることができます。
123456 -> 456 -> 1 桁目を読み取る
次のコードは、数字の右から n 番目の桁を示します。
public void getDigit(long n,int k){
int i=0;
long r =0;
while(i<n){
r=n%10;
n=n/10;
i++;
}
System.out.println( k + "th digit from right " + r);
}
int returndigit(int n,int d)
{
d=d-1;
while(d--)
{
n/=10;
}
return (n%10);
}
C では、次のようなことができます。ここで、n=0 は右端の数字を示します。
char nthDigitFromRight(int x,int n)
{
char str[20];
sprintf(str,"%020d",x);
return(str[19 - x]);
}
右端の桁を n=1 にしたい場合は、[19-x] を [20-x] に変更します。