2008-10-15 22 views
31

Ví dụ. 123456, và chúng tôi muốn thứ ba từ bên phải ('4') ra ngoài.Làm thế nào để có được chữ số thứ N của một số nguyên với các hoạt động bit-khôn ngoan?

Ý tưởng trong thực tế là truy cập từng chữ số một cách riêng biệt (ví dụ: 6 5 4 3 2 1).

Ưu tiên C/C++/C#.

+1

Bạn cần làm rõ - bạn đang tìm chữ số thập phân? Nếu vậy, các hoạt động bit-khôn ngoan không thích hợp. Bạn đang tìm kiếm số nhị phân, bát phân hoặc chữ số thập lục phân? Nếu có, thì các hoạt động bit-khôn ngoan là thích hợp. Ngoài ra, chúng là 'số nguyên', không phải 'intergers' (tiêu đề). –

Trả lời

-2

Trong C bạn có thể làm một cái gì đó như sau, trong đó n = 0 sẽ chỉ ra chữ số tận cùng bên phải

char nthDigitFromRight(int x,int n) 
{ 
    char str[20]; 
    sprintf(str,"%020d",x); 
    return(str[19 - x]); 
} 

Thay đổi [19 x] sang [20 x] nếu bạn muốn n = 1 cho bìa phải chữ số.

+0

Không nên trả lại (str [19 - x] - '0'); ? Và không nên là kiểu trả về là số nguyên ?? – sundar

+0

Không phải bằng cách đọc câu hỏi của tôi, thứ ba từ bên phải ('4'), '4' với tôi có nghĩa là một char, nếu nó đã nói mỗi chữ số là số nguyên, hoặc (4) thay vì ('4') i đã làm điều đó như bạn đề nghị. –

3

Lý do nó không hoạt động (dễ dàng) với các hoạt động bit-khôn ngoan là cơ sở của hệ thập phân (10) không phải là công suất của cơ sở của hệ nhị phân (2).

Nếu bạn đã mã hóa trong cơ số 8, bạn sẽ có pow(2, 3) == 8 và có thể trích xuất từng chữ số bát phân dưới dạng khối ba bit. Vì vậy, bạn thực sự phải chuyển đổi thành cơ sở 10, thường được thực hiện bằng cách chuyển đổi thành một chuỗi (với toString (Java) hoặc sprintf (C), như những người khác đã thể hiện trong câu trả lời của họ).

37

Một thực hiện hiệu quả hơn có thể là một cái gì đó như thế này:

char nthdigit(int x, int n) 
{ 
    while (n--) { 
     x /= 10; 
    } 
    return (x % 10) + '0'; 
} 

này giúp tiết kiệm công sức của chuyển đổi tất cả chữ số sang định dạng chuỗi nếu bạn chỉ muốn một trong số họ. Và, bạn không phải phân bổ không gian cho chuỗi được chuyển đổi.

Nếu tốc độ là một mối quan tâm, bạn có thể precalculate một loạt các quyền hạn của 10 và sử dụng n để chỉ số vào mảng này:

char nthdigit(int x, int n) 
{ 
    static int powersof10[] = {1, 10, 100, 1000, ...}; 
    return ((x/powersof10[n]) % 10) + '0'; 
} 

Như đã đề cập bởi những người khác, đây là gần như là bạn sẽ nhận được để Bitwise hoạt động cho cơ sở 10

+2

Giải pháp thứ hai là tốt nhất của những gì đã được đăng tốc độ khôn ngoan, tránh chuỗi, dấu chấm động, và vòng lặp. IMO phản hồi tốt nhất. –

+0

Điều này không thành công cho số âm, phải không? -480/100 = -5 –

+1

Lưu ý rằng trong ví dụ đầu tiên ở trên, tham số n là 0. nthdigit (1,1) == '0' && nthdigit (1,0) == '1' – eselk

4

Sử dụng cơ số 10 môn toán:

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; 
    } 
} 

Tạo:

6 
5 
4 
3 
2 
1 
0

Bạn có thể thử một bit shift-left (đối với N-1) và sau đó đọc chữ số tại [0], vì đây có thể là một phương pháp lắp ráp.

123456 -> 456 -> đọc chữ số đầu tiên

1

này làm việc cho ints unsigned lên đến 451.069, như được giải thích here:

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. 

Kiểm tra nó ra:

>>> hundreds_digit(123456) 
4 
>>> hundreds_digit(123956) 
9 

tôi d ngạc nhiên nếu nó nhanh hơn, mặc dù. Có lẽ bạn nên xem xét lại vấn đề của mình.

5

Chỉ cần dành thời gian viết điều này dựa trên câu trả lời ở đây, vì vậy tôi nghĩ rằng tôi sẽ chia sẻ.

Điều này dựa trên câu trả lời của Brannon, nhưng cho phép bạn nhận nhiều hơn một chữ số tại một thời điểm.Trong trường hợp của tôi, tôi sử dụng nó để trích xuất các phần từ ngày và thời gian được lưu trong một int nơi các chữ số có định dạng yyyymmddhhnnssm_s.

public static int GetDigits(this int number, int highestDigit, int numDigits) 
{ 
    return (number/(int)Math.Pow(10, highestDigit - numDigits)) % (int)Math.Pow(10, numDigits); 
} 

tôi đã làm cho nó một phần mở rộng, bạn có thể không muốn, nhưng ở đây là sử dụng mẫu:

int i = 20010607; 
string year = i.GetDigits(8,4).ToString(); 
string month = i.GetDigits(4,2).ToString(); 
string day = i.GetDigits(2,2).ToString(); 

kết quả:

năm = 2001

tháng = 6

ngày = 7

+0

Đó là C#, xin lỗi quên đề cập đến điều đó. – eselk

+1

Đây chính xác là những gì tôi đang tìm kiếm - một cách để trích xuất nhiều chữ số thập phân cùng một lúc. Cảm ơn! – hanmari

1

giá trị = (số% (10^position))/10^(vị trí - 1)

Ví dụ:

number = 23846

position = 1 -> value = 6

position = 2 -> value = 4

position = 3 -> value = 8

Đây là một phương pháp hữu ích Objective-C đơn giản để làm điều này:

+ (int)digitAtPosition:(int)pos of:(int)number { 

    return (number % ((int)pow(10, pos)))/(int)pow(10, pos - 1); 
} 
0

mã sau đây sẽ cho chữ số thứ n từ đúng trong một số:

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); 
} 
0

Chỉ cần cho vui, đây là C# mở rộng lớp cho nó:

public static class IntExtensions 
{ 
    /// <summary> 
    /// Returns the nth digit from an int, 
    /// where 0 is the least significant digit 
    /// and n is the most significant digit. 
    /// </summary> 
    public static int GetDigit(this int number, int digit) 
    { 
     for (int i = 0; i < digit; i++) 
     { 
      number /= 10; 
     } 
     return number % 10; 
    } 
} 

Cách sử dụng:

int myNumber = 12345; 
int five = myNumber.GetDigit(0); 
int four = myNumber.GetDigit(1); 
int three = myNumber.GetDigit(2); 
int two = myNumber.GetDigit(3); 
int one = myNumber.GetDigit(4); 
int zero = myNumber.GetDigit(5); 
-1
int returndigit(int n,int d) 
{ 
    d=d-1; 
    while(d--) 
    { 
     n/=10; 
    } 
    return (n%10); 
} 
-1

hai chữ số d1 và d2 sẽ được thông qua .Công chương trình phải in số thứ n là hệ thống con số đó chỉ gồm chữ số với d1 và d2 định dạng đầu vào Dòng đầu tiên chứa d1 Dòng thứ hai chứa d2 con bò thứ ba chứa n d1 không bằng d2

Các vấn đề liên quan