2010-04-09 16 views
15

In C++, come faccio a combinare (nota: non aggiungere) due numeri interi in un unico intero grande?Combina due numeri in uno. Esempio: 123 e 456 diventano 123456

Ad esempio:

int1 = 123; 
int2 = 456; 

C'è una funzione di prendere i due numeri e girare intCombined in 123456?

EDIT:

mio male per non spiegare chiaramente. Se int2 è 0, la risposta dovrebbe essere 123, non 1230. In realtà però, int1 (il numero sul lato sinistro) avrebbe solo un valore se int2 supera il limite di 32 bit. Quindi quando int2 è 0, int1 è 0 (o garbage, non sono sicuro).

+2

Se 'int2' è 0, è la risposta' 123' o '1230'? –

+1

È 'int2' sempre 3 cifre? Se è così, '(int1 * 1000) + int2' funziona. Questo potrebbe probabilmente essere modificato per qualsiasi 'int2', non sono sicuro di come. – igul222

+1

Interessante problema. Non sono sicuro quale sia l'approccio migliore. Hmmm – Germ

risposta

16

La potenza di dieci, che è necessario moltiplicare il primo numero con, è il più piccolo, che è più grande del secondo numero:

int combine(int a, int b) { 
    int times = 1; 
    while (times <= b) 
     times *= 10; 
    return a*times + b; 
} 
+0

tranne che le ore iniziano alle 10, per gestire il caso quando b = 0, vedere i commenti della domanda. AFAICT che risolve rende questo approccio l'unico metodo non stringa che fornisce la risposta corretta. Inoltre, la moltiplicazione è più veloce della divisione, sostituendo un gruppo di divisioni con un singolo multiplo. –

+1

Mi piace questa risposta la migliore finora, ma sarebbe meglio se si usasse log10 invece del ciclo. Inoltre, potresti voler rendere il tipo restituito un int a 64 bit. – rmeador

+0

@sth Tutto quello che devi fare è cambiare il tempo in un do-while, e b = 0 è considerato. Migliore risposta! – csj

9

È possibile convertirli in stringhe, combinarle e quindi riconvertirle in int?

+0

È questo l'unico modo per farlo? Se è così, qual è il codice? – jiake

4

Si potrebbe utilizzare stringstream:

string Append(int _1, int _2){ 
    stringstream converter; 

    converter << _1 << _2; 

    return converter.str(); 
} 

quindi chiamare atoi sulla stringa restituita.

+3

Oppure usa '>>' .... – Potatoswatter

+0

Potresti spiegare un po 'su stringstream? Non ho familiarità con questo. – jiake

+0

@ Bei337: vedere http://www.cplusplus.com/reference/iostream/stringstream/ – Void

6

Per ogni cifra in int2, si può più int1 da 10 e quindi aggiungere int2:

// merge(123, 0) => 1230 
int merge(int int1, int int2) 
{ 
    int int2_copy = int2; 
    do 
    { 
     int1 *= 10; 
     int2_copy /= 10; 
    } while (int2_copy); 

    return int1 + int2; 
} 

Si potrebbe eliminare il ciclo utilizzando log10 e ceil.

+0

Scusate: non stavo cercando di copiarvi. Mi hai appena battuto sul pugno. – csj

+1

Il tipo di reso dovrebbe essere qualcosa a 64 bit (__int64 per MSVC, long long per gcc, potrebbe dipendere anche dalla piattaforma). Anche int1 come usato nel loop dovrebbe essere a 64 bit. Ah, e "int" non è necessariamente neanche a 32 bit, quindi è necessario un nuovo tipo di piattaforma :). – Eugene

+0

Questa funzione sembra affamata del ciclo di clock. Il metodo pubblicato di seguito da Buckley funzionerebbe meglio? Se è così, qualcuno può mostrare il codice? In caso contrario, perché il metodo fusione() è migliore \ più efficiente? – jiake

6

Supponendo che entrambi gli inte siano non negativi, e int1 va a sinistra e int2 va a destra, è necessario capire quante cifre int2 è lungo, moltiplicare int1 per 10 un mucchio di volte e quindi aggiungerle .

unsigned int int1 = blah; 
unsigned int int2 = blah; 

unsigned int temp = int2; 

do 
{ 
    temp /= 10; 
    int1 *= 10; 
} while (temp >0) 

unsigned int newInt = int1 + int2; 
+0

+1 - ottimo uso di 'unsigned'! –

+0

Ottimo approccio CSJ. Hai copiato dal ragazzo qui sopra (Samuel). – Germ

+0

@Germ Non stavo tentando di copiare - Samual era più veloce nel sollevarlo. – csj

0

Un'altra opzione che funziona per C anche:

#include <stdio.h> 

int CombineInt(int int1, int int2) 
{ 
    char cResult[32]; 

    sprintf(cResult, "%d%d", int1, int2); 
    return atoi(cResult); 
} 
1

Quello che segue è essenzialmente la soluzione di qc accettato ma con la b == 0 correzione, e il ciclo sostituito con un'espressione di calcolare direttamente la scala:

#include <math.h> 

int combine(int a, int b) 
{ 
    int times = 1; 
    if(b != 0) 
    { 
     times = (int)pow(10.0, (double)((int)log10((double)b)) + 1.0); 
    } 
    return a * times + b ; 
} 

In alcune circostanze (come una destinazione con una FPU e una buona libreria matematica) l'espressione potrebbe essere più veloce del ciclo, ma non ho verificato tale ipotesi.

4

Se i numeri che si sta tentando di combinare sono numeri interi positivi, è possibile utilizzare pairing Functions.

La funzione di associazione crea un numero univoco da due. È anche una funzione reversibile.

x,y -> z 
z -> x,y 

z = (x+y)(x+y+1)/2 + y 

Poi il contrario è:

w = floor((sqrt(8z+1)-1)/2) 
t = (w*w + w)/2 
y = z - t 
x = w - y 

Nota.Quanto sopra non è in alcuna lingua specifica. Solo un po 'di matematica ...

-1
#include <iostream> 
using namespace std; 

int main() 

{ 
int num1,num2,comb,a,c; 

    cout << "Enter the 1st numbers" << endl; 
    cin>>num1; 
    cout << "Enter the 2st numbers" << endl; 
    cin>>num2; 
    a=num2/10; 
    if(a<=9){ 
     c=num1*100; 
    comb=c+num2; 
    cout<<"The combination of the two numbers is "<<comb; 
    } 
    else if(a>9&&a<=19){ 
     c=num1*1000; 
    comb=c+num2; 
    cout<<"The combination of the two numbers is "<<comb<<endl; 
    } 
    else if(a>19&&a<=29){ 
     c=num1*10000; 
    comb=c+num2; 
    cout<<"The combination of the two numbers is "<<comb<<endl; 
    } 

    return 0; 
} 
+0

Yous dovrebbe spiegare la tua idea. Il codice senza spiegazioni ha poco valore. Si prega di aggiungere spiegazioni al tuo post. – Tacet

+0

Seriamente? Spero ti renderai conto che la tua risposta è in ritardo, non documentata e sbagliata ... – Amxx