Как обратить число как целое число, а не как строку? - PullRequest
12 голосов
/ 11 января 2010

Я столкнулся с вопросом "Как можно повернуть число как целое число, а не как строку?" Может ли кто-нибудь помочь мне узнать ответ? Сторнирование должно полностью изменить десятичные цифры числа, то есть использовать основание 10.

Ответы [ 17 ]

42 голосов
/ 11 января 2010

Как то так?

public int ReverseInt(int num)
{
    int result=0;
    while (num>0) 
    {
       result = result*10 + num%10;
       num /= 10;
    }
    return result;
}

Как хакерский однострочный (обновление: использовал комментарий Бенджамина, чтобы его сократить):

num.ToString().Reverse().Aggregate(0, (b, x) => 10 * b + x - '0');

Ускоренный лайнер на четверть:

public static int ReverseOneLiner(int num)
{
    for (int result=0;; result = result * 10 + num % 10, num /= 10) if(num==0) return result;
    return 42;
}

Это не однострочник, потому что мне пришлось включить return 42;. Компилятор C # не позволил мне скомпилировать, потому что он думал, что ни один путь кода не вернул значение.

P.S. Если вы пишете код, подобный этому, и коллега ловит его, вы заслуживаете всего, что он / она делает с вами. Будьте предупреждены!

РЕДАКТИРОВАТЬ: я задавался вопросом о том, насколько медленнее однострочное LINQ, поэтому я использовал следующий код теста:

public static void Bench(Func<int,int> myFunc, int repeat)
{
    var R = new System.Random();
    var sw = System.Diagnostics.Stopwatch.StartNew();
    for (int i = 0; i < repeat; i++)
    {
        var ignore = myFunc(R.Next());
    }
    sw.Stop();
    Console.WriteLine("Operation took {0}ms", sw.ElapsedMilliseconds);
}

Результат (10 ^ 6 случайных чисел в положительном диапазоне int32):

While loop version:
Operation took 279ms

Linq aggregate:
Operation took 984ms
27 голосов
/ 11 января 2010

Это должно сделать это:

int n = 12345;
int left = n;
int rev = 0;
while(left>0)
{
   r = left % 10;   
   rev = rev * 10 + r;
   left = left / 10;  //left = Math.floor(left / 10); 
}

Console.WriteLine(rev);
4 голосов
/ 11 января 2010

Ура! Путь побрякушки. (Нет, правда. Надеюсь, это больше вопрос "Как бы я это сделал ...", а не то, что вам действительно нужно в производстве)

public int Reverse(int number) {
  return int.Parse(number.ToString().Reverse().Aggregate("", (s,c) => s+c));
}
4 голосов
/ 11 января 2010

умножить это на -1? уточните свой вопрос, пожалуйста ...

4 голосов
/ 11 января 2010
using System; 

public class DoWhileDemo {   
  public static void Main() { 
    int num; 
    int nextdigit; 

    num = 198; 

    Console.WriteLine("Number: " + num); 

    Console.Write("Number in reverse order: "); 

    do { 
      nextdigit = num % 10; 
      Console.Write(nextdigit); 
      num = num / 10; 
    } while(num > 0); 

    Console.WriteLine(); 
  }   
}
3 голосов
/ 05 августа 2013

Проверьте ниже просто и легко -

public int reverseNumber(int Number)
{
  int ReverseNumber = 0;
  while(Number > 0)
  {
    ReverseNumber = (ReverseNumber * 10) + (Number % 10);
    Number = Number / 10;
  }
  return ReverseNumber;
}

Ссылка: Программа обратного номера в c #

2 голосов
/ 11 января 2010

Вы не можете. Так как в любом случае компьютер мыслит в шестнадцатеричном формате, вам необходимо токенизировать число в арабский формат, который семантически идентичен преобразованию в строку.

1 голос
/ 12 апреля 2010
    /// <summary>
    /// Reverse a int using its sting representation.
    /// </summary>
    private int ReverseNumber(int value)
    {
        string textValue = value.ToString().TrimStart('-');

        char[] valueChars = textValue.ToCharArray();
        Array.Reverse(valueChars);
        string reversedValue = new string(valueChars);
        int reversedInt = int.Parse(reversedValue);

        if (value < 0)
           reversedInt *= -1;

        return reversedInt;
    }
1 голос
/ 27 июня 2014

Я посмотрел на следующее решение. Но как насчет того, когда n отрицательно?

Допустим, n = -123456

Вот трюк, который я добавил для обработки отрицательных чисел, с этим допущением, что он будет угрожать отрицательным числам точно так же.

        int reverse = 0;
        bool isNegative = false;

        if (n < 0)
            isNegative = true;

        n = Math.Abs(n);
        while (n > 0)
        {
            int rem = n % 10;
            reverse = (reverse * 10) + rem;
            n = n / 10;
        }

        if (isNegative)
            reverse = reverse * (-1);

        return reverse;
1 голос
/ 13 августа 2013

Старая тема, но я не видел этого варианта:

        int rev(int n) {
            string str = new String(n.ToString().Reverse().ToArray());
            return int.Parse(str);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...