2011-01-06 12 views
9

Mam całkowitą:C++ dostać każdą cyfrę w Int

int iNums = 12476; 

A teraz chcę dostać każdą cyfrę od iNums As Integer. Coś jak:

foreach(iNum in iNums){ 
    printf("%i-", iNum); 
} 

Tak więc wyjście będzie: "1-2-4-7-6-". Ale ja właściwie potrzebuję każdej cyfry jako int nie jako char.

Dzięki za pomoc.

Odpowiedz

-6
int iNums = 12345; 
int iNumsSize = 5; 
for (int i=iNumsSize-1; i>=0; i--) { 
    int y = pow(10, i); 
    int z = iNums/y; 
    int x2 = iNums/(y * 10); 
    printf("%d-",z - x2*10); 
} 
+1

Deklaracja rozmiaru numeru z góry jest zarówno żmudna, jak i niepotrzebna – KillianDS

+0

Dzięki, to w potrzebuję kapelusza, ponieważ i tak mam stały rozmiar. – Ilyssis

+22

Lub alternatywnie, odczekaj trochę czasu, aby sprawdzić, czy uzyskasz jeszcze lepszą odpowiedź. Najszybszy niekoniecznie najlepszy. – razlebe

20

Konwertuj na ciąg, a następnie powtórz znaki. Do konwersji można użyć std::ostringstream, np

int iNums = 12476; 
std::ostringstream os; 

os << iNums; 
std::string digits = os.str(); 

Btw powszechnie używany termin (za to, co nazywamy „number”) to „cyfra” - należy go używać, ponieważ to sprawia, że ​​tytuł postu znacznie więcej zrozumiałe :-)

+0

Zmieniłem tę cyfrę na cyfrę. – Ilyssis

+0

+1: Jest to najbardziej ogólny/elastyczny sposób rozwiązania tego typu problemów w C++: naucz się tego i będziesz gotowy na wiele innych drobnych zadań. Gdy masz 'cyfry', możesz powtórzyć ciąg znaków, drukując każdą cyfrę, jak tylko chcesz. –

+0

Jest to ok do drukowania, ale potrzebowałem cyfry jako int do pracy z nimi. – Ilyssis

4

Nie testuję tego tylko napisz, co jest w mojej głowie. usprawiedliwieniem dla jakiegokolwiek błędu składni

Oto online ideone demo

vector <int> v; 

int i = .... 
while(i != 0){ 
    cout << i%10 << " - "; // reverse order 
    v.push_back(i%10); 
    i = i/10; 
} 

cout << endl; 

for(int i=v.size()-1; i>=0; i--){ 
    cout << v[i] << " - "; // linear 
} 
+2

Powoduje wydrukowanie każdej cyfry w odwrotnej kolejności –

+0

(-1), ponieważ otrzymujesz 7654321 zamiast 1-2-3-4-5-7. –

+2

tylko trochę niedbalstwa, moi przyjaciele, nie bądź taki surowy –

28
void print_each_digit(int x) 
{ 
    if(x >= 10) 
     print_each_digit(x/10); 

    int digit = x % 10; 

    std::cout << digit << '\n'; 
} 
+1

+1: pokonałeś mnie w rekurencyjnym rozwiązaniu. Zostawię tutaj moje, ale przyjechałeś tu pierwszy. –

+0

Pamiętaj, że ten kod może nie przepłukać strumienia cout. Zmień '' '<< '\ n'''' na' '' << endl''', aby upewnić się, że cout jest przepłukany. – Andreas

+2

@Andreas [nie używaj 'endl', chyba że jest to potrzebne] (http://en.cppreference.com/w/cpp/io/manip/endl). – Abyx

8

Tutaj jest bardziej rodzajowe chociaż rekurencyjne rozwiązanie, które daje wektor cyfr:

void collect_digits(std::vector<int>& digits, unsigned long num) { 
    if (num > 9) { 
     collect_digits(digits, num/10); 
    } 
    digits.push_back(num % 10); 
} 

Jako że są stosunkowo małą liczbą cyfr, rekurencja jest starannie ograniczona.

0

Drawn z odpowiedzią D.Shawley, można pójść nieco dalej, aby całkowicie odebrać przez outputing Rezultat:

void stream_digits(std::ostream& output, int num, const std::string& delimiter = "") 
{ 
    if (num) { 
     stream_digits(output, num/10, delimiter); 
     output << static_cast<char>('0' + (num % 10)) << delimiter; 
    } 
} 

void splitDigits() 
{ 
    int num = 12476;  
    stream_digits(std::cout, num, "-");  
    std::cout << std::endl; 
} 
0

nie wiem, czy to jest szybciej lub wolniej lub bezwartościowe, ale byłoby to alternatywa:

int iNums = 12476; 
string numString; 
stringstream ss; 
ss << iNums; 
numString = ss.str(); 
for (int i = 0; i < numString.length(); i++) { 
    int myInt = static_cast<int>(numString[i] - '0'); // '0' = 48 
    printf("%i-", myInt); 
} 

Zwracam na to uwagę jako iNums nawiązuje do możliwie wejściowego użytkownika, a jeśli wejście użytkownik był ciąg w pierwszej kolejności, że nie będzie musiał przejść przez kłopotów konwersji int do strunowy.

(to_string może być stosowany w C++ 11)

-1

Wiem, że to stary post, ale wszystkie te odpowiedzi były nie do zaakceptowania dla mnie, więc napisałem własną rękę!

Moim celem było renderowanie numeru na ekranie, stąd nazwy funkcji.

void RenderNumber(int to_print) 
{ 
    if (to_print < 0) 
    { 
     RenderMinusSign() 
     RenderNumber(-to_print); 
    } 
    else 
    { 
     int digits = 1; // Assume if 0 is entered we want to print 0 (i.e. minimum of 1 digit) 
     int max = 10; 

     while (to_print >= max) // find how many digits the number is 
     { 
      max *= 10; 
      digits ++; 
     } 

     for (int i = 0; i < digits; i++) // loop through each digit 
     { 
      max /= 10; 
      int num = to_print/max; // isolate first digit 
      to_print -= num * max; // subtract first digit from number 
      RenderDigit(num); 
     } 
    } 
} 
1

Można to zrobić za pomocą tej funkcji:

void printDigits(int number) { 
    if (number < 0) { // Handling negative number 
     printf('-'); 
     number *= -1; 
    } 
    if (number == 0) { // Handling zero 
     printf('0'); 
    } 
    while (number > 0) { // Printing the number 
     printf("%d-", number % 10); 
     number /= 10; 
    } 
} 
0

podstawie @ odpowiedź Abyx, ale używa div tak, że tylko 1 podział odbywa się za cyfrą.

#include <cstdlib> 
#include <iostream> 

void print_each_digit(int x) 
{ 
    div_t q = div(x, 10); 

    if (q.quot) 
     print_each_digit(q.quot); 

    std::cout << q.rem << '-'; 
} 

int main() 
{ 
    print_each_digit(12476); 
    std::cout << std::endl; 
    return 0; 
} 

wyjściowa:

1-2-4-7-6- 

nb Działa tylko dla nie-negatywnych stron int.

0

Aby cyfry w pozycji "POS" (począwszy od pozycji 1 w najmniej znaczących cyfr (LSD))

digit = (int)(number/pow(10,(pos-1))) % 10; 

przykład: Nr = 57820 -> poz = 4 -> cyfrowy = 7


do sekwencyjnego get cyfry:

int num_digits = floor(log10(abs(number?number:1)) + 1); 
for(; num_digits; num_digits--, number/=10) { 
    std::cout << number % 10 << " "; 
} 

przykład: Nr = 57820 -> Wydajność: 0 2 8 7 5

0

Proponowane rozwiązanie:

void getSumDigits(int n) { 
    std::vector<int> int_to_vec; 
    while(n>0) 
    { 
     int_to_vec.push_back(n%10); 
     n=n/10; 
    } 

    int sum; 

    for(int i=0;i<int_to_vec.size();i++) 
    { 
     sum+=int_to_vec.at(i); 

    } 
    std::cout << sum << ' '; 
} 
0

Odpowiedź wcześniej używanych to jest prostą funkcją:

int getDigit(int n, int position) { 

    return (n%(int)pow(10, position) - (n % (int)pow(10, position-1)))/(int)pow(10, position-1); 

} 

Mam nadzieję, że ktoś uzna to za pomocne!