Cómo agregar un número entero (con un número entero) en C++

Me preguntaba si alguien podría decirme cómo agregar un número entero (con otro número entero) en C++. Básicamente, si tengo un int con este valor 67, ¿cómo lo agregaría con el número 4 para que el entero sea ahora 674? ¡Gracias por adelantado!

preguntado el 02 de septiembre de 12 a las 20:09

6 Respuestas

Multiplique el primero por diez a la potencia del dígito del segundo y sume el otro.

Ejemplo: 63 y 5

63*10=630
630+5 =635

Ejemplo: 75 y 34

75*100=7500
7500+34=7534
int i1=75;
int i2=34;
int dn=ceil(log10(i2+0.001));     //0.001 is for exact 10, exact 100, ...
int i3=i1*ceil(pow(10,dn)); <---- because pow would give 99.999999(for some optimization modes)
i3+=i2;

Edit: La versión de cadena necesita 2 conversión de int a str (que es lenta) y 1 concatenación de cadena (que no es rápida) y 1 conversión de str a int (que es lenta). La conversión superior necesita 2 adiciones, 1 logaritmo, 2 techos, 1 potencia, 1 multiplicación, todo lo cual se puede hacer en la CPU sin tocar la memoria principal para obtener/establecer datos para subpasos que seguramente tienen menos latencia que las versiones de cadena. Si las cadenas de caracteres 3-4 se almacenan en registros sse por diseño del compilador, ambos competirían por el rendimiento. Porque mientras uno estaría ocupado calculando la función de "potencia", el otro estaría ocupado extrayendo cadenas de sse y colocando los registros necesarios uno por uno y construyendo en otro registro comenzando sumas y multiplicaciones. La función Power(10,x) se puede intercambiar por 10*10*10.... x veces para que la versión matemática pura vuelva a ser más rápida.

Si lo que necesita es legibilidad, la respuesta de eq- es la mejor en mi opinión.

respondido 30 mar '16, 00:03

Puede obtener el número de dígitos por ceil(log10(i1)) - usuario267885

Tener cuidado log10(10) es exactamente 1, por lo que el resultado puede ser incorrecto. Quizás ceil(log10(i1+.1)) - usuario267885

int appended = std::stoi(std::to_string(i1) + std::to_string(i2));
// error checking left as an exercise

Respondido el 02 de Septiembre de 12 a las 20:09

¿Qué reemplazo con los números/variables? - Toby

#include <iostream>
#include <string>

int appendDigit(int base, int append) {
   std::string sBase = std::to_string(base);
   std::string sAppend = std::to_string(append);
   std::string result = sBase + sAppend;
   return std::stoi(result);

}

int main() {
   int a = 67;
   int b = 4;
   int c = appendDigit(a,b);
   std::cout << c;
}

Respondido el 02 de Septiembre de 12 a las 20:09

Cuenta los dígitos de los números existentes, multiplica por su décima potencia y suma al segundo número.

Respondido el 02 de Septiembre de 12 a las 20:09

int append_digits(int i1, int i2) {
    int result = 0;
    while (i1) {
        result *= 10;
        result += i1 % 10;
        i1 /= 10;
    }
    while (i2) {
        result *= 10;
        result += i2 % 10;
        i2 /= 10;
    }
    int final_result = 0;
    while (result) {
        final_result *= 10;
        final_result += result % 10;
        result /= 10;
    }
    return final_result;
}

La refactorización para reducir la duplicación de código se deja como ejercicio para el lector.

Respondido el 02 de Septiembre de 12 a las 21:09

Aquí hay uno más serio:

int append_digits(int i1, int i2) {
    int i2_copy = i2;
    while (i2_copy) {
        i1 *= 10;
        i2_copy /= 10;
    }
    return i1 + i2;
}

Esto evita las conversiones de cadena y matemática de punto flotante.

Respondido el 02 de Septiembre de 12 a las 21:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.