2010-01-11 21 views
12

Me encontré con una pregunta "¿Cómo se puede revertir un número como un número entero y no como una cadena?" ¿Alguien podría ayudarme a encontrar la respuesta?¿Cómo revertir un número como un entero y no como una cadena?

+1

Definir "revertir un número como un entero" –

+0

¿Puede ser más preciso? –

+0

¿Quiere decir: invertir los dígitos de su representación decimal? –

Respuesta

22

Esto debe hacerlo:

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

Muchas gracias, pero creo que esto no funcionará cuando el número dado tenga 0 al final. al igual que 40 –

+4

, seguirá funcionando en números con 0 – jerjer

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

¿Alló como esto?

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

Como hacker de una sola línea (actualización utilizado comentario de Benjamin para acortarlo):

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

Una rápida de uno y un cuarto-liner:

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

No es de una sola línea porque tuve que incluir return 42;. El compilador de C# no me dejaba compilar porque pensaba que ninguna ruta de código devolvía un valor.

P.S. Si escribe un código como este y un compañero de trabajo lo atrapa, se merece todo lo que le hace a usted. ¡Ten cuidado!

EDIT: I preguntó acerca de cómo mucho más lento el LINQ de una sola línea es, por lo que utiliza el siguiente código de referencia:

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

de Resultados (10^6 números aleatorios en el rango int32 positivo):

While loop version: 
Operation took 279ms 

Linq aggregate: 
Operation took 984ms 
+0

Aunque el one-liner es muy ineficiente. – kennytm

+0

Por supuesto, es por eso que lo llamé hackish. Es más una curiosidad. – cfern

+1

ToCharArray() es redundante y puede hacer la conversión de char a int de su selección en el agregado también - ahorra espacio horizontal. :) Vea mi ejemplo a continuación para la versión solo de cadena. –

4

multiplicarlo por -1? precisa su pregunta por favor ...

+0

En realidad, como mencioné en la línea de preguntas ... me encontré con esta pregunta en un sitio web, donde se han publicado varias preguntas de la entrevista. Entonces también estoy confundido con la línea de pregunta. –

6

Yay! Una manera bling. (No, en serio. Espero que esto es más un "¿Cómo voy a hacer ..." cuestión y no es algo que realmente necesita en la producción)

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

¡solución muy agradable! – Flynn

2

No se puede. Como la computadora piensa en hexadecimal en cualquier caso, es necesario que el número se muestre en formato árabe, que es semánticamente idéntico a la conversión a cadena.

+0

@Alex: para ser más precisos, la computadora funciona con bits y hexadecimal es un múltiplo exacto (es decir: grupos de 4 bits por cada dígito hexadecimal). Pero todavía puede hacer matemáticas, como se mostró arriba. – kriss

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

Comprobar debajo simple y fácil -

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

Referencia:Reverse number program in c#

1

hilo viejo, pero no vi esta variación:

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

Miré la siguiente solución. Pero, ¿qué tal si n es negativo?

permite decir n = -123.456

Aquí es un pellizco añadí a ella para manejar números negativos, con el supuesto de que se adormece negativo amenaza de la misma manera.

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

la solución más corta:

 int reverse=0; 
     int number = 21; 

     while (number > 0) 
     { 
      reverse = number % 10; 
      Console.Write(reverse); 
      number = number/10; 
     } 
0
int x = 9876543; 
char[] arr = x.ToString().ToCharArray(); 
Array.Reverse(arr); 
Console.WriteLine(int.Parse(new string(arr))); 
0

Según Pritam Karmakar comentario, Sí, esto no funcionará cuando el número dado tiene 0 al final. Si pasa el número como 150, devolverá 51, no 051. , así que tuve que escribir el código para mostrar el número en orden inverso, según la entrada del usuario, por favor verifique esto.

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(); 
-1
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(); 
Cuestiones relacionadas