2009-05-06 61 views
11

Nói rằng tôi cóCó cách nào dễ dàng để biến một int thành một mảng ints của mỗi chữ số?

var i = 987654321; 

Có một cách dễ dàng để có được một mảng của các chữ số, tương đương với

var is = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 

mà không .ToString() ing và lặp lại qua các ký tự với int.Parse(x)?

+2

Hết sức tò mò: Điều đó sẽ tốt cho điều gì? – Tomalak

+0

Tại sao "không lặp lại các ký tự"? – Kamarey

+0

đánh tôi với nó, hehe –

Trả lời

21
public Stack<int> NumbersIn(int value) 
{ 
    if (value == 0) return new Stack<int>(); 

    var numbers = NumbersIn(value/10); 

    numbers.Push(value % 10); 

    return numbers; 
} 

var numbers = NumbersIn(987654321).ToArray(); 

Alternative mà không đệ quy:

public int[] NumbersIn(int value) 
{ 
    var numbers = new Stack<int>(); 

    for(; value > 0; value /= 10) 
     numbers.Push(value % 10); 

    return numbers.ToArray(); 
} 
+0

Chuyển đổi danh sách thành một mảng bằng cách thêm .ToArray() – Scoregraphic

+0

Tôi chỉ làm như bạn đã nhận xét :) –

+0

Sở thích cá nhân sử dụng vòng lặp thay vì một thời gian chờ trong trường hợp bất cứ ai thắc mắc. –

2

Nói tóm lại: sử dụng vòng lặp mà chia số modulo 10 (%) để có được lời nhắc nhở (mỗi chữ số) và đặt nó vào mảng.

4
var x = new Stack<int>(); 
do 
{ 
    x.Push(i % 10); 
    i /= 10; 
} while (i > 0); 
return x.ToArray(); 
+1

* ho * thành một mảng int * ho * –

+0

Cảm ơn. Cập nhật nó để trông hơi ngu ngốc :-) – marklam

5

Một cách khác mà không sử dụng đệ quy và sử dụng một Stack mà tránh tái phân bổ trên mỗi chèn (ít nhất là trong 32 chữ số đầu tiên):

var list = new Stack<int>(32); 
var remainder = 123456; 
do 
{ 
    list.Push(remainder % 10); 
    remainder /= 10; 
} while (remainder != 0); 

return list.ToArray(); 

Và vâng, phương pháp này cũng làm việc cho 0 và số âm.

Điều thú vị là cho thuật toán này một số âm -123.456 và bạn sẽ nhận được {-1, -2, -3, -4, -5, -6}

Cập nhật: chuyển từ sử dụng Danh sách để Stack vì điều này tự động đưa ra thứ tự đúng.

+0

Cảm ơn lời nhắc ..., @Tomalak –

+0

Đã xóa nó rồi. +1 anyway. – Tomalak

-2

này chuyển sang chuỗi và duyệt qua các nhân vật, nhưng nó có phải nó loại tự động và trong một lớp lót:

var i = 987654321; 
var is = i.ToString().Cast<int>().ToArray(); 
+3

Điều này không hoạt động. Đầu tiên, bạn sẽ nhận được một InvalidCastException. Thứ hai, int x = (int) '1'; không mang lại giá trị 1, nhưng giá trị Unicode cho ký tự '1' là 49. –

+3

VÀ bạn không thể sử dụng "là" làm tên biến;) –

11

Tôi biết có những câu trả lời có lẽ là tốt hơn so với điều này, nhưng đây là một phiên bản:

Bạn có thể sử dụng yield return để trả về các chữ số theo thứ tự tăng dần (theo trọng lượng hoặc bất kỳ thứ gì được gọi).

public static IEnumerable<int> Digits(this int number) 
{ 
    do 
    { 
     yield return number % 10; 
     number /= 10; 
    } while (number > 0); 
} 

12345 => 5, 4, 3, 2, 1

+0

tôi luôn thích ví dụ năng suất tốt, có +1 –

+0

tôi nữa , đó là lý do tại sao tôi không thể cưỡng lại! – Svish

1

Strings và có thể vui vẻ (một số tùy chọn khác sẽ nhanh hơn ... nhưng điều này là khá dễ dàng)

var @is = 987654321.ToString().Select(c => c - 48).ToArray(); 
Các vấn đề liên quan