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

Как изменить число как целое число, а не как строку?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Что-то вроде этого?

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;. Компилятор С# не позволил мне скомпилировать, потому что считал, что никакой путь кода не возвращает значение.

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

EDIT: я задавался вопросом о том, насколько медленнее однострочный 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

Ответ 3

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

Ответ 4

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

Ответ 5

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

public int Reverse(int number) {
  return int.Parse(number.ToString().Reverse().Aggregate("", (s,c) => s+c));
}

Ответ 6

Проверьте простую и легкую настройку -

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

Старый поток, но я не видел этого варианта:

        int rev(int n) {
            string str = new String(n.ToString().Reverse().ToArray());
            return int.Parse(str);
        }

Ответ 10

Я рассмотрел следующее решение. Но как насчет того, когда 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;

Ответ 11

кратчайшее решение:

        int reverse=0;
        int number = 21;

        while (number > 0)
        {
            reverse = number % 10;
            Console.Write(reverse);
            number = number / 10;  
        }

Ответ 12

Согласно комментарию Pritam Karmakar Да, это не сработает, если в конце номера будет 0. Если вы передадите номер 150, он вернет 51 не 051. поэтому я написал код для отображения номера в обратном порядке в соответствии с пользовательским вводом, пожалуйста, проверьте это.

int reverseNum = 0, reminder, num;
        Console.WriteLine("Enter Number to Reverse:");
        int.TryParse(Console.ReadLine(), out num);
        bool isZero = false;
        int cnt=0;
        while (num > 0)
        {
            reminder = num % 10;
            reverseNum = (reverseNum * 10) + reminder;
            num = num / 10;
            if (reverseNum == 0)
                isZero = true;                
            cnt++;
        }
        if (isZero)
        {
            Console.WriteLine(reverseNum.ToString().PadLeft(cnt, '0'));
        }
        else
        {
            Console.WriteLine(reverseNum);
        }
        Console.ReadKey();

Ответ 13

    public static void Main(string[] args)
    {
        int reversed = Reverse(-7360);
    }

    public static int Reverse(int number, int left = 0, int right = 0)
    {
        if (number == 0) return left + right;
        return Reverse(number / 10, left * 10 + right * 10, number % 10);
    }

Ответ 14

    static void Main(string[] args)
    {
        Console.WriteLine("Please enter number");
        int number = Convert.ToInt32(Console.ReadLine());
        Console.WriteLine(ReverseLoop(number));
        Console.WriteLine(ReverseRecursive(number));
        Console.ReadLine();
    }

    public static int ReverseRecursive(int number)
    {
        int remainder = number % 10;
        number = number / 10;
        if (number < 1)
            return remainder;
        return ReverseRecursive(number) + remainder * Convert.ToInt32(Math.Pow(10, number.ToString().Length));
    }

    public static int ReverseLoop(int number)
    {
        int reversed = 0;
        while (number > 0)
        {
            reversed = reversed * 10 + (number % 10);
            number = number / 10;
        }
        return reversed;
    }

Ответ 15

Решение, предложенное @jerjer и @cfern, является идеальным, но оно не будет работать для отрицательного целого числа, как -1234507.

Решение: Если число отрицательное, то умножьте на -1, после этого вызовите ваш метод ReverseInt (-1234507)

    int number = -1234507;
    **number = number > 0 ? number : (number * -1);**

    int reverseNumber = 0;

    while(number > 0){
        reverseNumber = (reverseNumber * 10) +  (number % 10) ;
        number = number / 10;
    }
    Console.WriteLine(reverseNumber);

Ответ 16

int x = 9876543;
char[] arr = x.ToString().ToCharArray();
Array.Reverse(arr);
Console.WriteLine(int.Parse(new string(arr)));

Ответ 17

int sum = 0; int remainder = 0;
        int n = 123;
        for (int i = n; i > 0; i = i / 10)
        {
            remainder = i % 10;
            sum = (sum * 10) + remainder;
        }
Console.WriteLine(sum);
Console.ReadLine();

Ответ 18

новенький:

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        int i = 234;
        int j = -123;
        Console.WriteLine(reverse(i));
        Console.WriteLine(reverse(j));
    }

    static int reverse(int i)
    {
        int sign = i / Math.Abs(i);
        var abs = string.Concat(Math.Abs(i).ToString().Reverse());
        return int.Parse(abs) * sign;
    }
}

https://dotnetfiddle.net/VGJJFf