2009-12-07 29 views
11

vorrei convertire un intero in una matrice, in modo che appaia simile al seguente:Converti numero intero di serie

int number = 123456 ; 
int array[7] ; 

con il risultato:

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

puoi spiegare cosa hai già provato tu stesso e perché non ha funzionato? – catchmeifyoutry

+0

È compito, ma morderò. Mia moglie non l'ha capito davvero fino a quando non gliel'ho spiegato. – Broam

+8

Qualcosa non va nel tuo "...". Ci sono 7 membri dell'array, ma solo 6 cifre decimali nel numero. –

risposta

0

Il modo più semplice che posso immaginare ora è:

char array[40]; 
int number = 123456; 

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

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

Inoltre è possibile convertire ogni cifra in int sottraendo il valore del char di 0x30.

MODIFICA: Se si tratta di un compito a casa, probabilmente l'insegnante ti chiede di scrivere il programma utilizzando% operatore (esempio 12% 10 = 2). Se questo è il caso, buon lavoro ;-)

+0

che è un array di caratteri, non un array int – catchmeifyoutry

+0

Se si intende utilizzare sprintf, si prega di utilizzare almeno snprintf – philsquared

+0

So che si tratta di un array di caratteri, ma è possibile convertire facilmente in int sottraendo il valore di char di 0x30, come ho osservato nella risposta. snprintf non è standard C – Andres

4

è possibile estrarre l'ultima cifra del numero in questo modo:

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

noti che si dovrebbe anche verificare se number è positivo. Altri valori richiedono una gestione aggiuntiva.

0

È possibile utilizzare il modulo per determinare l'ultima cifra.

Ed è possibile utilizzare la divisione per spostare un'altra cifra fino alla posizione dell'ultima cifra.

8

basta usare aritmetica modulare:

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

che ne dici di una risposta che spiega effettivamente l'approccio in modo che l'OP * impari * qualcosa? – jalf

+0

Anche questo è hardcoded per gestire numeri a 6 cifre – philsquared

+0

Che funzionerà correttamente solo con numeri interi non negativi a 6 cifre. –

22

Forse una soluzione migliore è quella di lavorare a ritroso:

123456 % 10 = 6

123456/10 = 12345

12345 % 10 = 5

12345/10 = 1234

1

Prendere il log10 del numero per ottenere il numero di cifre. Inseritelo, ad esempio pos, quindi, in un loop, prendete il modulo di 10 (n % 10), inserite il risultato nell'array in posizione pos. Diminuire pos e dividere il numero per 10. Ripetere fino a pos == 0

Cosa volevi fare con il segno se è negativo?

0

Non puoi semplicemente "convertirlo". Il numero intero non è rappresentato nel software in notazione decimale. Quindi le singole cifre che vuoi non esistono. Devono essere calcolati.

Quindi, dato un numero arbitrario, come si può determinare il numero di quelli?

Potremmo dividere per dieci, e poi prendere il resto: per 123, la divisione darebbe 12, e poi c'è un resto di 3. Quindi ne abbiamo 3. Il 12 ci dice che cosa abbiamo passato quelli, quindi può essere il nostro input per la prossima iterazione. Prendiamo questo, dividiamo per 10, e prendiamo 1, e un resto di 2. Quindi abbiamo 2 nel posto delle decine, e 1 a sinistra con cui lavorare per centinaia. Dividi quello per 10, che ci dà zero, e un resto di 1.Quindi otteniamo 1 posto su centinaia, 2 su dieci e 3 su quello. E abbiamo finito, poiché l'ultima divisione ha restituito zero.

0

se questo è davvero compiti a casa quindi vederlo tuo insegnante - solo per divertimento ;-)

ATTENZIONE! prestazioni molto povera, modo maldestro per raggiungere l'effetto che ci si aspetta e in genere non farlo a casa (lavoro) ;-)

#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

Se si voleva trasformarlo in una stringa allora sarebbe davvero facile, basta fare quello che chiunque altro sta dicendo di usare l'operatore%:

Diciamo num = 123, siamo in grado di fare questo:

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 
} 

Ora è possibile utilizzare str come un array di caratteri. Fare questo con un array è una seccatura perché mettere le cose all'inizio di un array richiede di spostare tutto il resto. Quello che possiamo fare è, invece di mettere ogni cifra in una stringa, possiamo metterla in una pila. Lo inserirà in un ordine a ritroso come questo: 3 2 1. Quindi possiamo estrarre il primo numero uno per uno e inserirlo in un array nell'ordine corretto. La matrice sarà simile a questa: 1 2 3. Lascerò l'implementazione a te poiché questo è compito.

@Broam ha una buona soluzione, ma come ha affermato, è per lavorare all'indietro. Penso che l'OP o chiunque stia esaminando questo thread lo vorrà inoltrare ed è per questo che sto postando questo. Se hai una soluzione migliore, per favore rispondi, mi interessa pure.

2

In questo caso, la funzione integerToArray restituisce un vettore che viene convertito dal valore intero. puoi testarlo anche con la funzione principale:

#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 
Problemi correlati