Объедините два числа в одно. Пример: 123 и 456 становятся 123456

В C++, как, я объединяюсь (примечание: не добавляют), два целых числа в одно большое целое число?

Например:

int1 = 123;
int2 = 456;

Существует ли функция, чтобы взять эти два числа и повернуть intCombined в 123 456?

Править:

Мое плохое для того, чтобы не объяснять ясно. Если int2 0, то ответ должен быть 123, не 1230. В действительности, хотя, int1 (число на левой стороне) только имел бы значение, если int2 пробегается через предел на 32 бита. Таким образом, когда int2 0, затем int1 0 (или мусор, я не уверен).

18
задан jiake 9 April 2010 в 22:22
поделиться

7 ответов

Степень десяти, на которую нужно умножить первое число, является наименьшей единицей, которая больше второго числа:

int combine(int a, int b) {
   int times = 1;
   while (times <= b)
      times *= 10;
   return a*times + b;
} 
19
ответ дан 30 November 2019 в 06:17
поделиться

Вы можете использовать stringstream:

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

    converter << _1 << _2;

    return converter.str();
}

, а затем вызвать atoi для возвращаемой строки.

4
ответ дан 30 November 2019 в 06:17
поделиться

Другой вариант, который также работает для C:

#include <stdio.h>

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

  sprintf(cResult, "%d%d", int1, int2);
  return atoi(cResult);
}
0
ответ дан 30 November 2019 в 06:17
поделиться

Следующее, по сути, является принятым решением sth, но с исправлением b == 0, а цикл заменен выражением для прямого вычисления масштаба:

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

В некоторых случаях (например, цель с FPU и хорошей математической библиотекой) выражение может быть быстрее цикла, но я не проверял эту гипотезу.

2
ответ дан 30 November 2019 в 06:17
поделиться

Для каждой цифры в int2, вы можете умножить int1 на 10 и затем добавить 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;
}

Вы можете избавиться от цикла, используя log10 и ceil.

7
ответ дан 30 November 2019 в 06:17
поделиться

Предполагая, что оба целых числа неотрицательны, а int1 идет слева, а int2 справа, вам нужно выяснить, сколько цифр в int2 , умножьте int1 на 10 несколько раз, а затем сложите их.

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;
6
ответ дан 30 November 2019 в 06:17
поделиться

Вы могли бы преобразовать их в строки, объединить их и затем преобразовать обратно в int?

9
ответ дан 30 November 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: