Ответ 1
Сила десяти, которую нужно умножить на первое число с, является наименьшей, которая больше, чем второе число:
int combine(int a, int b) {
int times = 1;
while (times <= b)
times *= 10;
return a*times + b;
}
В С++, как мне объединить (примечание: не добавлять) два целых числа в одно большое целое?
Например:
int1 = 123;
int2 = 456;
Есть ли функция, чтобы взять два числа и включить intCombined в 123456?
EDIT:
Мой плохой для того, чтобы не ясно объяснять. Если int2 равно 0, тогда ответ должен быть 123, а не 1230. На самом деле, если int1 (число слева) будет иметь значение, если int2 перейдет через 32-битный предел. Поэтому, когда int2 равно 0, int1 равно 0 (или мусор, я не уверен).
Сила десяти, которую нужно умножить на первое число с, является наименьшей, которая больше, чем второе число:
int combine(int a, int b) {
int times = 1;
while (times <= b)
times *= 10;
return a*times + b;
}
Вы можете преобразовать их в строки, объединить их и затем преобразовать обратно в int?
Для каждой цифры в 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
.
Предполагая, что оба int не являются неотрицательными, а 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;
Вы можете использовать stringstream:
string Append(int _1, int _2){
stringstream converter;
converter << _1 << _2;
return converter.str();
}
затем вызовите atoi
в возвращаемой строке.
Если числа, которые вы пытаетесь объединить, представляют собой целые положительные числа, вы можете использовать функции сопряжения.
Функция сопряжения создает уникальный номер из двух. Это также обратимая функция.
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
Примечание. Вышеизложенное не на каком-либо конкретном языке. Просто какая-то математика...
Следующее, по сути, принятое решение, но с исправлением 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 и хорошая библиотека математики) выражение может быть быстрее, чем цикл, но я не тестировал эту гипотезу.
Другой вариант, который работает и для C:
#include <stdio.h>
int CombineInt(int int1, int int2)
{
char cResult[32];
sprintf(cResult, "%d%d", int1, int2);
return atoi(cResult);
}
#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;
}