Haz todo lo posible por comprender el código de forma correcta previamente a utilizarlo a tu proyecto si tquieres aportar algo puedes dejarlo en la sección de comentarios.
Solución:
unsigned concatenate(unsigned x, unsigned y)
unsigned pow = 10;
while(y >= pow)
pow *= 10;
return x * pow + y;
Prueba de compilación/corrección/velocidad
evito el log10
y pow
funciones, porque estoy bastante seguro de que usan punto flotante y son lentos, así que esto puede que sea más rápido en su máquina. Quizás. Perfil.
z = x * pow(10, log10(y)+1) + y;
Explicación:
Primero obtienes el número de dígitos de la variable que debe ir en segundo lugar:
int digits = log10(y)+1; // will be 2 in your example
Luego “desplazas” la otra variable multiplicándola por 10^dígitos.
int shifted = x * pow(10, digits); // will be 1100 in your example
Finalmente agregas la segunda variable:
z = shifted + y; // 1111
O en una línea:
z = x * pow(10, (int)log10(y)+1) + y;
Puede que esta no sea una solución óptima o rápida, pero nadie la mencionó y es simple y podría ser útil.
podrías usar sprintf()
y un strtol()
.
char str[100];
int i=32, j=45;
sprintf(str, "%d%d", i, j);
int result=strtol(str, NULL, 10);
Primero escribes a un string los números uno seguido del otro con sprintf()
(al igual que imprimiría en la salida estándar con printf()
) y luego convertir la resultante string al número con strtol()
.
strtol()
devuelve un long
que puede ser un valor mayor que lo que se puede almacenar en un int
por lo que es posible que desee verificar primero el valor resultante.
int result;
long rv=strtol(str, NULL, 10);
if(rv>INT_MAX || rv
Si el valor devuelto por strtol()
no está dentro del rango de un int
(es decir, no entre (incluyendo) INT_MIN
y INT_MAX
), Se produjo un error. INT_MIN
y INT_MAX
son de limits.h
.
Si el valor de en el string es demasiado grande para ser representado en un long
, errno
se establecerá en ERANGE
(desde errno.h
) debido al desbordamiento.
Leer sobre strtol()
aquí.
Editar:
Como señaló el esclarecedor comentario de chqrlie, los números negativos causarían problemas con este enfoque.
Podrías usar esto o una modificación de esto para sortear eso
char str[100], temp[50];
int i=-32, j=45, result;
sprintf(temp, "%+d", j);
sprintf(str, "%d%s", i, temp+1);
long rv=strtol(str, NULL, 10);
Primero imprima el segundo número a un carácter array temp
junto con su signo.
los +
en %+d
hará que se imprima el signo del número.
Ahora imprime el primer número y el segundo número para str
pero sin el signo parte del segundo número. Omitimos la parte del signo del segundo número ignorando el primer carácter en temp
.
Finalmente, el strtol()
está hecho.
Puntuaciones y comentarios
Recuerda que tienes la capacidad de agregar una reseña si te fue de ayuda.