2011-12-29 11 views

Odpowiedz

4

Zakładam, że rozumiesz jako cyfry dziesiętne (podstawa 10). Prawdopodobnie jesteś w stanie dostosować rozwiązania do innych systemów liczbowych, zastępując je 10.

Należy zauważyć, że operacja modulo jest trudna w przypadku ujemnych argumentów. Dlatego wybrałem typ danych jako niepodpisaną liczbę całkowitą.

Jeśli chcesz przetwarzać najmniej znaczącą cyfrę pierwszą, można wypróbować następujące niesprawdzone podejście:

uint32_t n = 1191223; 
do { 
    uint32_t digit = n%10; 
    // do something with digit 
} 
while (n/=10); 

Jeśli wolisz chodzić przez cyfr zaczynając od najbardziej znaczącej cyfry, można starać się dostosować następujący kod niesprawdzone:

uint32_t n = 1191223; 
#define MAX_DIGITS 10 // log10((double)UINT32_MAX)+1 
uint32_t div = pow(10, MAX_DIGITS); 

// skip the leading zero digits 
while (div && !(n/div)) div/=10; 
if (!div) div = 10; // allow n being zero 

do { 
    uint32_t digit = (n/div)%10; 
    // do something with digit 
} 
while (div/=10); 
0

coś takiego:

char data[128]; 
int digits = 1191223; 
sprintf(data, "%d", digits); 
int length = strlen(data); 
for(int i = 0; i < length; i++) { 
    // iterate through each character representing a digit 
} 

Należy zauważyć, że w przypadku użycia liczby ósemkowej, takiej jak 0100, należy również zmienić wartość sprintf(data, "%d", digits); na sprintf(data, "%o", digits);.

+0

Krister, Jeśli moja cyfra zaczyna się od "0", to daje mi to złą długość, czy wiesz dlaczego? Btw ludzie naprawdę lubią wszystkie odpowiedzi powyżej. – kforkarim

+0

@kforkarim - Dodałem aktualizację do obsługi liczb ósemkowych - numery zaczynające się od '0' – Cyclonecode

3

Chcesz dokonać iteracji po dziesięciocyfrowych cyfrach, ale liczba całkowita nie ma pojęcia arabskiej notacji i cyfr. Przekonwertować go do pierwszego łańcucha:

int i = 1191223; 
char buffer[16]; 
char *j; 
snprintf(buffer, 16, "%i", i); 
for (j = buffer; *j; ++j) { /* digit is in *j - '0' */ } 
+0

thiton Jestem po prostu ciekawy co masz na myśli tutaj przez * j - '0', czy unika pierwszego 0? Próbowałem to z cyfrą 0191223 i długość nie wydaje się być właściwa, jakieś sugestie? – kforkarim

+1

@kforkarim prawdopodobnie jest to konwersja 'char2int':' uint32_t digit = * j-'0 '; '. Upewnij się, że obsługuje '' -'', który może zawierać ciąg znaków. – moooeeeep

0

hackish sposobem jest przekonwertować to ciąg (patrz strtol), a następnie do przestawienia tego numeru. można użyć coś takiego character you want - '0'

0

Off górze mojej głowie: "I% 100000", "I% 100000" ...

rekurencyjna rozwiązanie pozwoli Ci zacząć od "I% 10" .

1

Można użyć sprintf() aby przekształcić go w char tablicy, a następnie iterację, że jak tak (niesprawdzone, żeby zacząć grę):

int a = 1191223; 
char arr[16]; 
int rc = sprintf(arr, "%d", a); 

if (rc < 0) { 
    // error 
} 

for (int i = 0; i < rc; i++) { 
    printf("digit %d = %d\n", i, arr[i]); 
} 
1
void access_digits(int n) 
{ 
     int digit; 
     if (n < 0) n = -n; 
     do { 
       digit = n % 10; 
       /* Here you can do whatever you 
        want to do with the digit */ 
     } while ((n/=10) > 0); 
} 
8

przodu, lub do tyłu?

Zakładając dodatnia:

unsigned int n = 1191223; 

    while (n != 0) { 
     doSomething (n % 10); 
     n /= 10; 
    } 

... zadziała najmniejszego do największego, albo ...

EDIT Zapomniałam o tym nieprodukcyjnym rozwiązania miałem tutaj.Zauważ, że funkcja Very Smart People ™ wydaje się używać konsekwentnie od najmniejszej do największej iteracji (zarówno jądro Linux, jak i GLibC's printf, na przykład po prostu iterować do tyłu), ale tutaj jest kiepski sposób, aby to zrobić, jeśli naprawdę nie chcesz używać snprintf z jakiegoś powodu ...

int left_to_right (unsigned int n) { 
    unsigned int digit = 0; 

    if (0 == n) { 
    doSomething (0); 
    } else { 
    digit = pow(10, 1.0+ floor(log10(n))); 
    while (digit /= 10) { 
     doSomething ((n/digit) % 10); 
    } 
    } 
} 

Zakładam, że jest to bardzo głupie zakładać, że masz log10 i pow ale nie snprintf, więc alternatywny projekt byłby

int left_to_right_fixed_max (unsigned int n) { 
    unsigned int digit = 1000000000; /* make this very big */ 
    unsigned int n10 = 10 * n; 

    if (0 == n) { 
    doSomething (0); 
    } else { 
    while (digit > n10) { digit /= 10; } 
    while (digit /= 10) { 
     doSomething ((n/digit) % 10); 
    } 
    } 
} 

... lub, jeśli naprawdę don” • Masz sprzęt pomnożyć/podzielić, możesz uciec się do używania at w stanie mocy dziesięciu.

int left_to_right (unsigned int n) { 
    static const unsigned int digit [] = 
    { 1, 
     10, 
     100, 
     1000, 
     10000, 
     100000, 
     1000000, 
     10000000, 
     100000000, 
     1000000000 /* make this very big */ 
    }; 
    static const unsigned char max_place = 10; 
    /* length of the above array */ 

    unsigned char decimal; 
    unsigned char place; 
    unsigned char significant = 0; /* boolean */ 

    if (0 == n) { 
    doSomething (0); 
    } else { 
    place = max_place; 
    while (place--) { 
     decimal = 0; 
     while (n >= digit[place]) { 
     decimal++; 
     n -= digit[place]; 
     } 
     if (decimal | significant) { 
     doSomething (decimal); 
     significant |= decimal; 
     } 
    } 
    } 
} 

... co mam z http://www.piclist.com/techref/language/ccpp/convertbase.htm dostosowany do nieco większej wersji ogólnego przeznaczenia.

+0

Twoja pierwsza wersja jest od początku do przodu, jak uzyskać cyfry od przodu i do góry, jak 1234> 1 2 3, a następnie 4 raczej 4 3 2 i 1 .. dzięki – kforkarim

+0

iteracja działa dobrze na przyszłość, ale jej pomijanie zero, żadnych pomysł, dlaczego to robi? – kforkarim

+0

Wow, jestem pewien, że popełniłem jakiś głupi niedopatrzeń - przyjrzę się dziś wieczorem. :-(Głupio tylko wypróbowałem to z "1191123!" – BRFennPocock

Powiązane problemy