Подтвердить что ты не робот

Объединение целых чисел в С#

Существует ли недорогой способ объединить целые числа в csharp?

Пример: 1039 и 7056 = 10397056

4b9b3361

Ответ 1

Если вы можете найти ситуацию, когда это достаточно дорого, чтобы вызвать какие-либо проблемы, я буду очень впечатлен:

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. (подписано, конечно).

Ответ 2

Я немного опаздываю на вечеринку, но недавно мне пришлось объединить целые числа. С 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;
}

Ответ 3

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

Ответ 4

недорого? Строковая конкатенация или форматированная строка, вероятно, будет значительно быстрее.

В противном случае вы можете сделать что-то вроде:

Math.Pow(10,Math.Ceiling(Math.Log10(second)))*first+second

если первый и второй являются целыми числами. Речь идет об единственном способе, которым вы это сделаете, не включая преобразование в строку и обратно, , но я очень сомневаюсь, что это будет быстрее.

Ответ 5

Я не думаю, что вы можете сделать это проще:

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

Ответ 6

Если вы хотите связать многие int с строкой

StringBuilder sb = new StringBuilder(1039);
sb.Append(7056);
sb.Append(1234);
sb.Append(1235);
....
sb.Append(9999);
sb.ToString();

Ответ 7

Если мы хотим получить целочисленный результат, то:

int result = int.Parse(input1.ToString() + input2.ToString());

Для результата строки выполните следующее:

string result = input1.ToString() + input2.ToString();

Ответ 8

Метод "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.

Ответ 9

как насчет этого?

int c = b;
while(c > 0) {
   a *= 10;
   c /= 10;
}
a += b;

Ответ 10

Не очень недорого, но:

string con = string.Format("{0}{1}",int1,int2);

или

string con = int1.ToString() + int2.ToString();

Если вы используете это в цикле, я думаю, что я бы использовал Option 1, который использует StringBuilder внутри.

Ответ 11

public int ConcatInts(int int1, int int2)
{
    return (int)(int1 * Math.Pow(10, int2.ToString().Length)) + int2;
}

Edit: Угадайте, что я не был первым с этим решением!

Ответ 12

//Объединение двух чисел программы //

        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();