35

例。123456 で、右から 3 番目 ('4') が必要です。

実際の考え方は、各桁に個別にアクセスすることです (つまり、6 5 4 3 2 1)。

C/C++/C# を推奨。

4

12 に答える 12

40

より効率的な実装は次のようになります。

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 のビット単位の演算に到達するのと同じくらい近いです。

于 2008-10-15T06:32:27.847 に答える
6

ここでの回答に基づいてこれを書くのに時間を費やしたので、共有したいと思いました。

これは 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

于 2013-04-18T23:39:41.510 に答える
5

基数 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
于 2008-10-15T06:37:13.547 に答える
4

ビット単位の演算で (簡単に) うまくいかない理由は、10 進法 (10) の基数が 2 進法 (2) の基数の累乗ではないためです。

基数 8 でコーディングしている場合、 がありpow(2, 3) == 8、各 8 進数を 3 ビットのブロックとして抽出できます。

そのため、実際には base 10 に変換する必要があります。これは通常、文字列に変換することによって行われます (toString (Java) または sprintf (C) を使用して、他の人が返信で示しているように)。

于 2008-10-15T06:30:22.157 に答える
4

ここで説明されているように、これは 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

もっと速かったらビックリですけどね。たぶん、あなたの問題を再考する必要があります。

于 2008-10-15T08:22:38.577 に答える
1

値 = (数値 % (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);
}
于 2014-11-02T05:09:37.900 に答える
0

これはアセンブラーのアプローチである可能性があるため、ビット単位の左シフト (N-1 の場合) を試してから [0] の数字を読み取ることができます。

123456 -> 456 -> 1 桁目を読み取る

于 2008-10-15T08:00:19.103 に答える
0

次のコードは、数字の右から 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);
 }
于 2015-07-08T09:11:52.257 に答える
-1
int returndigit(int n,int d)
{
    d=d-1;
    while(d--)
    {
        n/=10;
    }
    return (n%10);
}
于 2016-06-11T17:21:49.707 に答える
-2

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] に変更します。

于 2008-10-15T06:24:42.043 に答える