2010-04-09 15 views
15

En C++, ¿cómo combino (nota: no agrega) dos enteros en un entero grande?Combina dos números en uno. Ejemplo: 123 y 456 se convierten en 123456

Por ejemplo:

int1 = 123; 
int2 = 456; 

¿Existe una función para tomar los dos números y girar en intCombined 123456?

EDIT:

Mi mal por no explicar claramente. Si int2 es 0, entonces la respuesta debería ser 123, no 1230. Sin embargo, en realidad, int1 (el número del lado izquierdo) solo tendría un valor si int2 supera el límite de 32 bits. Entonces, cuando int2 es 0, entonces int1 es 0 (o basura, no estoy seguro).

+2

Si 'int2' es 0, ¿la respuesta es '123' o' 1230'? –

+1

¿'int2' siempre tiene 3 dígitos? Si es así, '(int1 * 1000) + int2' funciona. Esto probablemente podría modificarse para cualquier 'int2', simplemente no estoy seguro de cómo. – igul222

+1

Problema interesante. No estoy seguro de cuál es el mejor enfoque. Hmmm – Germ

Respuesta

16

La potencia de diez, que es necesario multiplicar el primer número con, es el más pequeño, que es más grande que el segundo número:

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

excepto los tiempos comienzan en 10, para manejar el caso cuando b = 0, vea los comentarios de la pregunta. AFAICT que la corrección hace que este enfoque sea el único método no de cadena que arroje la respuesta correcta. Además la multiplicación es más rápida que la división, esto reemplaza un grupo de divisiones con una sola multiplicación. –

+1

Me gusta esta respuesta la mejor hasta el momento, pero sería mejor si usa log10 en lugar del bucle. Además, es posible que desee hacer que el tipo de devolución sea de 64 bits int. – rmeador

+0

@sth Todo lo que necesita hacer es cambiar el tiempo a un do-while, yb = 0 se considera. ¡La mejor respuesta! – csj

9

¿Podría convertirlos en cadenas, combinarlos y luego convertirlos de nuevo a un int?

+0

¿Es esta la única manera de hacerlo? Si es así, ¿cuál es el código? – jiake

4

Usted podría utilizar stringstream:

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

    converter << _1 << _2; 

    return converter.str(); 
} 

luego llamar a atoi en la cadena devuelta.

+3

O use '>>' .... – Potatoswatter

+0

¿Podría explicar un poco sobre el flujo de cadenas? No estoy familiarizado con esto. – jiake

+0

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

6

Para cada dígito en int2, puede múltiple int1 por 10 y luego añadir 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; 
} 

Usted podría deshacerse del bucle utilizando log10 y ceil.

+0

Lo siento, no estaba intentando copiarlo. Usted acaba de ganarme el golpe. – csj

+1

El tipo de devolución debería ser algo de 64 bits (__int64 para MSVC, larga duración para gcc, también podría depender de la plataforma). También int1 como se usa en el ciclo debería ser de 64 bits. Ah, y "int" no es necesariamente de 32 bits tampoco, así que de nuevo el tipo específico de plataforma necesitaba :). – Eugene

+0

Esta función se ve el ciclo del reloj hambriento. ¿Funcionaría mejor el método publicado a continuación por Buckley? Si es así, ¿alguien puede mostrar el código? Si no, ¿por qué la fusión() es mucho mejor \ más eficiente? – jiake

6

Suponiendo que ambas entradas no son negativas, y int1 va a la izquierda e int2 va a la derecha, necesita averiguar cuántos dígitos es int2 largo, multiplicar int1 por 10 varias veces y luego agréguelos .

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 - excelente uso de 'unsigned'! –

+0

Gran enfoque CSJ. Copiaste del hombre de arriba (Samuel). – Germ

+0

@Germ No estaba tratando de copiar - Samual fue más rápido en levantarse. – csj

0

Otra opción que funciona para C también:

#include <stdio.h> 

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

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

la siguiente es esencialmente la solución de sth aceptado pero con la b == 0 fix, y el bucle reemplazado con una expresión para calcular la escala directamente:

#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 ; 
} 

En algunas circunstancias (como un objetivo con una FPU y una buena biblioteca de matemáticas) la expresión puede ser más rápida que el bucle, pero no he probado esa hipótesis.

4

Si los números que intenta combinar son enteros positivos, puede usar pairing Functions.

La función de emparejamiento crea un número único a partir de dos. También es una función reversible.

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

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

A continuación, la inversa es:

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

Nota.Lo anterior no está en ningún idioma específico. Solo algunas matemáticas ...

-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 debería explicar su idea. El código sin explicaciones tiene poco valor. Por favor agrega explicaciones a tu publicación. – Tacet

+0

en serio? Espero que te des cuenta de que tu respuesta es tardía, indocumentada e incorrecta ... – Amxx

Cuestiones relacionadas