Объедините два числа в одно. Пример: 123 и 456 становятся 123456 - PullRequest
18 голосов
/ 10 апреля 2010

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

Например:

int1 = 123;
int2 = 456;

Есть ли функция, позволяющая взять два числа и превратить intCombined в 123456?

РЕДАКТИРОВАТЬ:

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

Ответы [ 9 ]

19 голосов
/ 10 апреля 2010

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

int combine(int a, int b) {
   int times = 1;
   while (times <= b)
      times *= 10;
   return a*times + b;
} 
9 голосов
/ 10 апреля 2010

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

7 голосов
/ 11 сентября 2013

Если числа, которые вы пытаетесь объединить, являются положительными целыми числами, вы можете использовать Функции сопряжения .

Функция сопряжения создает уникальный номер из двух. Это также обратимая функция.

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

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

Тогда обратное:

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

Примечание. Выше не на каком-то конкретном языке. Просто математика ...

7 голосов
/ 10 апреля 2010

Для каждой цифры в 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.

6 голосов
/ 10 апреля 2010

Предполагая, что оба целых числа неотрицательны, и int1 идет слева, а int2 идет справа, вам нужно выяснить, сколько цифр long 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;
4 голосов
/ 10 апреля 2010

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

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

    converter << _1 << _2;

    return converter.str();
}

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

2 голосов
/ 10 апреля 2010

Следующее является по существу принятым решением 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 и хорошая математическая библиотека) выражение может быть быстрее, чем цикл, но я не проверял эту гипотезу.

0 голосов
/ 28 апреля 2015
#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 голосов
/ 10 апреля 2010

Еще одна опция, которая работает и для C:

#include <stdio.h>

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

  sprintf(cResult, "%d%d", int1, int2);
  return atoi(cResult);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...