Существует ли недорогой способ объединить целые числа в csharp?
Пример: 1039 и 7056 = 10397056
Существует ли недорогой способ объединить целые числа в csharp?
Пример: 1039 и 7056 = 10397056
Если вы можете найти ситуацию, когда это достаточно дорого, чтобы вызвать какие-либо проблемы, я буду очень впечатлен:
int a = 1039;
int b = 7056;
int newNumber = int.Parse(a.ToString() + b.ToString())
Или, если вы хотите, чтобы это было немного больше ".NET-ish":
int newNumber = Convert.ToInt32(string.Format("{0}{1}", a, b));
int.Parse - не дорогостоящая операция. Потратьте свое время на беспокойство по поводу сетевых операций ввода/вывода и регулярных выражений O ^ N.
Другие примечания: накладные расходы на создание экземпляра StringBuilder означает, что нет смысла, если вы выполняете только несколько конкатенаций. И очень важно - если вы планируете превратить это обратно в целое число, имейте в виду, что оно ограничено ~ 2 000 000 000. Конкатенация чисел очень велика очень быстро и, возможно, выходит за пределы возможностей 32-битного int. (подписано, конечно).
Я немного опаздываю на вечеринку, но недавно мне пришлось объединить целые числа. С 0 < a, b < 10 ^ 9 это можно сделать довольно быстро.
static ulong concat(uint a, uint b)
{
if (b < 10U) return 10UL * a + b;
if (b < 100U) return 100UL * a + b;
if (b < 1000U) return 1000UL * a + b;
if (b < 10000U) return 10000UL * a + b;
if (b < 100000U) return 100000UL * a + b;
if (b < 1000000U) return 1000000UL * a + b;
if (b < 10000000U) return 10000000UL * a + b;
if (b < 100000000U) return 100000000UL * a + b;
return 1000000000UL * a + b;
}
Изменить: приведенная ниже версия может быть интересной (платформа target: x64).
static ulong concat(ulong a, uint b)
{
const uint c0 = 10, c1 = 100, c2 = 1000, c3 = 10000, c4 = 100000,
c5 = 1000000, c6 = 10000000, c7 = 100000000, c8 = 1000000000;
a *= b < c0 ? c0 : b < c1 ? c1 : b < c2 ? c2 : b < c3 ? c3 :
b < c4 ? c4 : b < c5 ? c5 : b < c6 ? c6 : b < c7 ? c7 : c8;
return a + b;
}
string ConcatInt(int x,int y){return String.Format("{0}{1}",x,y);}
int ConcatInt(int x,int y){
return (x * Math.Pow(10, y.length)) + y;
}
Редактировать Примечание. Исправлены некоторые ошибки. Осталось больше проблем с типом. Я просто даю контур ответа
Второй метод должен быть:
static int ConcatInt2(int x, int y) {
return (int)(x * Math.Pow(10, y.ToString().Length)) + y;
}
недорого? Строковая конкатенация или форматированная строка, вероятно, будет значительно быстрее.
В противном случае вы можете сделать что-то вроде:
Math.Pow(10,Math.Ceiling(Math.Log10(second)))*first+second
если первый и второй являются целыми числами. Речь идет об единственном способе, которым вы это сделаете, не включая преобразование в строку и обратно, , но я очень сомневаюсь, что это будет быстрее.
Я не думаю, что вы можете сделать это проще:
static uint Concat (uint a, uint b)
{
uint
pow = 1;
while (pow < b)
{
pow = ((pow << 2) + pow) << 1;
a = ((a << 2) + a) << 1;
}
return a + b;
}
который не имеет распределений памяти, преобразований строк или умножений; или возможно:
static uint Concat (uint a, uint b)
{
uint
pow = 1;
while (pow < b)
{
pow = ((pow << 2) + pow) << 1;
}
return a * pow + b;
}
Если вы хотите объединить два двоичных числа:
static uint Concat (uint a, uint b)
{
uint
mask = uint.MaxValue;
while ((mask & b) != 0)
{
mask <<= 1;
a <<= 1;
}
return a | b;
}
Если вы хотите связать многие int с строкой
StringBuilder sb = new StringBuilder(1039);
sb.Append(7056);
sb.Append(1234);
sb.Append(1235);
....
sb.Append(9999);
sb.ToString();
Если мы хотим получить целочисленный результат, то:
int result = int.Parse(input1.ToString() + input2.ToString());
Для результата строки выполните следующее:
string result = input1.ToString() + input2.ToString();
Метод "Mathy" и "No String" следует:
int a = 1039;
int b = 7056;
int bLen = (int)Math.Ceiling(Math.Log10(b));
int ab = (a * ((int)Math.Pow(10, bLen))) + b;
Обратите внимание, что он все еще может быть медленным из-за вызова Log10.
как насчет этого?
int c = b;
while(c > 0) {
a *= 10;
c /= 10;
}
a += b;
Не очень недорого, но:
string con = string.Format("{0}{1}",int1,int2);
или
string con = int1.ToString() + int2.ToString();
Если вы используете это в цикле, я думаю, что я бы использовал Option 1, который использует StringBuilder внутри.
public int ConcatInts(int int1, int int2)
{
return (int)(int1 * Math.Pow(10, int2.ToString().Length)) + int2;
}
Edit: Угадайте, что я не был первым с этим решением!
//Объединение двух чисел программы //
Console.WriteLine("Enter a number for a");
int a = int.Parse(Console.ReadLine());
Console.WriteLine("Enter a number for b");
int b = int.Parse(Console.ReadLine());
int Concatenating = Convert.ToInt32(string.Format("{0}{1}", a, b));
Console.WriteLine(Concatenating);
Console.ReadKey();