2009-12-07 18 views
11

Chciałbym przekonwertować liczbę całkowitą do tablicy, tak, że wygląda jak poniżej:Konwersja Integer na tablicy

int number = 123456 ; 
int array[7] ; 

z wynikiem:

array[0] = 1 
array[1] = 2 
... 
array[6] = 6 
+5

czy możesz wyjaśnić, co już wypróbowałeś i dlaczego to nie zadziałało? – catchmeifyoutry

+0

To praca domowa, ale ugryzę. Moja żona tak naprawdę nie rozumiała tego, dopóki jej tego nie wyjaśniłem. – Broam

+8

Coś pójdzie nie tak w twoim "...". Jest 7 członków tablicy, ale tylko 6 cyfr dziesiętnych w liczbie. –

Odpowiedz

0

Najprostszym sposobem mogę sobie wyobrazić teraz jest:

char array[40]; 
int number = 123456; 

memset(array, 0x00, sizeof(array)); 

sprintf(array, "%d", number); 

Dodatkowo możesz przekonwertować każdą cyfrę na int, odejmując wartość char przez 0x30.

EDYCJA : Jeśli jest to praca domowa, nauczyciel prawdopodobnie poprosi cię o napisanie programu za pomocą operatora% (przykład 12% 10 = 2). Jeśli jest to przypadek, dobra praca domowa ;-)

+0

to jest tablica char, nie int array – catchmeifyoutry

+0

Jeśli masz zamiar użyć sprintf, proszę przynajmniej użycie snprintf – philsquared

+0

Znam jego tablicę char, ale można łatwo przekonwertować na int odjęcie wartości char przez 0x30, jak zauważyłem w odpowiedzi. snprintf nie jest standardem C. – Andres

4

Można wyodrębnić ostatnią cyfrę numeru w ten sposób:

int digit = number % 10; 
number /= 10; 

pamiętać, że należy również sprawdzić, czy number jest dodatni. Inne wartości wymagają dodatkowej obsługi.

0

Możesz użyć modułu do określenia ostatniej cyfry.

Możesz też użyć podziału, aby przenieść kolejną cyfrę do miejsca ostatniej cyfry.

8

wystarczy użyć arytmetykę modularną:

int array[6]; 
int number = 123456; 
for (int i = 5; i >= 0; i--) { 
    array[i] = number % 10; 
    number /= 10; 
} 
+4

Co powiesz na odpowiedź, która rzeczywiście wyjaśnia podejście, więc OP * uczy się * czegoś? – jalf

+0

Również ten jest zakodowany do czynienia z 6 cyfr numerów – philsquared

+0

który będzie działał prawidłowo tylko na 6 cyfr nieujemnych liczb całkowitych. –

22

Być może lepszym rozwiązaniem jest praca w tył:

123456 % 10 = 6

123456/10 = 12345

12345 % 10 = 5

12345/10 = 1234

1

Wykonaj log10 numeru, aby uzyskać liczbę cyfr. Wstaw to, powiedzmy pos, a następnie, w pętli, weź modulo 10 (n % 10), umieść wynik w tablicy na pozycji pos. Zmniejsz pos i podziel liczbę przez 10. Powtarzaj aż do pos == 0

Co chcesz zrobić ze znakiem, jeśli jest ujemny?

0

Nie można po prostu "przekonwertować". Liczba całkowita nie jest reprezentowana w oprogramowaniu w notacji dziesiętnej. Zatem poszczególne cyfry, które chcesz , nie istnieją. Muszą być obliczone.

A zatem, biorąc pod uwagę dowolną liczbę, jak ustalić liczbę?

Moglibyśmy podzielić przez dziesięć, a następnie wziąć resztę: dla 123, podział dałby 12, a następnie resztę 3. Więc mamy 3. Dwanaście mówi nam, co mamy za tymi, więc może to być nasz wkład do następnej iteracji. Przyjmujemy to, dzielimy przez 10 i otrzymujemy 1, a resztę 2. Mamy 2 w dziesiątkach i 1 do pracy dla setek. Podzielmy to przez 10, co daje nam zero, a resztę 1.Tak więc dostajemy 1 w setkach miejsc, 2 w dziesiątkach i 3 w tym miejscu. I skończyliśmy, bo ostatnia dywizja zwróciła zero.

0

jeśli jest to naprawdę praca domowa następnie pokazać je swojemu nauczycielowi - tylko dla zabawy ;-)

UWAGA! bardzo słabe wyniki, niezgrabny sposób, aby osiągnąć efekt można oczekiwać i na ogół nie rób tego w domu (praca) ;-)

#include <algorithm> 
#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 

typedef std::vector<int> ints_t; 

struct digit2int 
{ 
    int operator()(const char chr) const 
    { 
     const int result = chr - '0'; 
     return result; 
    } 
}; 

void foo(const int number, ints_t* result) 
{ 
    std::ostringstream os; 
    os << number; 
    const std::string& numberStr = os.str(); 
    std::transform(
     numberStr.begin(), 
     numberStr.end(), 
     std::back_inserter(*result), 
     digit2int()); 
} 

int main() 
{ 
    ints_t array; 
    foo(123456, &array); 
    std::copy(
     array.begin(), 
     array.end(), 
     std::ostream_iterator<int>(std::cout, "\n")); 
} 
0

Jeśli chciał przekształcić go w ciąg to byłoby naprawdę łatwe, po prostu robić to, co wszyscy inni mówią o użyciu operatora%:

Powiedzmy num = 123, możemy to zrobić:

string str; 
while (num > 0) 
{ 
    str = (num % 10) + str; //put last digit and put it into the beginning of the string 
    num = num /10; //strip out the last digit 
} 

teraz można użyć str jako tablica znaków. Robienie tego za pomocą tablicy jest kłopotliwe, ponieważ umieszczenie rzeczy na początku tablicy wymaga przesunięcia wszystkich innych elementów. Możemy to zrobić zamiast umieszczać każdą cyfrę w łańcuchu, możemy umieścić ją w stosie. Ułoży się to w odwrotnej kolejności: 3 2 1. Następnie możemy wyskoczyć z góry jeden po drugim i umieścić go w tablicy w odpowiedniej kolejności. Twoja tablica będzie wyglądać następująco: 1 2 3. Zostawię ci wdrożenie, ponieważ jest to praca domowa.

@Broam ma dobre rozwiązanie, ale jak stwierdził, jest do pracy w tył. Myślę, że OP lub ktoś, kto zajrzy do tego wątku, będzie chciał tego do przodu i dlatego to publikuję. Jeśli masz lepsze rozwiązanie, proszę odpowiedzieć, jestem również zainteresowany.

2

Oto co wymyśliłem, funkcja integerToArray zwraca wektor, który jest przekształcany z wartości całkowitej. możesz go przetestować także z główną funkcją:

#include <iostream> 
#include <vector> 
using namespace std; 

vector <int> integerToArray(int x) 
{ 
    vector <int> resultArray; 
    while (true) 
    { 
    resultArray.insert(resultArray.begin(), x%10); 
    x /= 10; 
    if(x == 0) 
     return resultArray; 
    } 
} 

int main() 
{ 
    vector <int> temp = integerToArray(1234567); 
    for (auto const &element : temp) 
     cout << element << " " ; 
    return 0; 
} 

//outputs 1 2 3 4 5 6 7