2010-01-11 5 views

Répondre

22

Cela devrait le faire:

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

Merci beaucoup, mais je pense que cela ne fonctionnera pas quand le nombre donné a 0 à la fin. tout comme 40 –

+4

il travaillera encore sur les chiffres avec 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

Quelque chose comme ça?

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

En uniligne hackish (mise à jour: utilisé le commentaire de Benjamin pour le raccourcir):

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

Un rapide une fois et un quart-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; 
} 

Ce n'est pas un one-liner parce que je devais inclure return 42;. Le compilateur C# ne me laisserait pas compiler car il pensait qu'aucun chemin de code ne renvoyait de valeur.

P.S. Si vous écrivez un code comme celui-ci et qu'un collègue l'attrape, vous méritez tout ce qu'il/elle vous fait. Être averti!

EDIT: J'interrogé sur la façon beaucoup plus lente du LINQ one-liner est, j'utilisé le code de référence suivant:

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

résultat (10^6 nombres aléatoires dans la fourchette de int32 positive):

While loop version: 
Operation took 279ms 

Linq aggregate: 
Operation took 984ms 
+0

Bien que le one-liner soit très inefficace. – kennytm

+0

Bien sûr, c'est pourquoi je l'ai appelé hackish. C'est plus une curiosité. – cfern

+1

ToCharArray() est redondant et vous pouvez aussi effectuer la conversion char en int de votre sélection dans l'agrégat - économise de l'espace horizontal. :) Voir mon exemple ci-dessous pour la version chaîne seule. –

4

multipliez-le par -1? préciser votre question s'il vous plaît ...

+0

En fait, comme je l'ai mentionné dans la ligne de question ... Je suis tombé sur cette question dans un site Web, où ils ont publié plusieurs questions d'entrevue. Donc, je suis également confus avec la ligne de question. –

6

Yay! Une manière de bling. (Non, vraiment. J'espère que cela est plus un « Comment pourrais-je faire ... » question et non quelque chose que vous avez vraiment besoin dans la production)

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

très belle solution! – Flynn

2

Vous ne pouvez pas. Puisque l'ordinateur pense en hexadécimal dans tous les cas, il est nécessaire pour tokenise le nombre en format arabe, qui est sémantiquement identique à la conversion en chaîne.

+0

@Alex: pour être plus précis, l'ordinateur fonctionne avec des bits et l'hexadécimal est un multiple exact (c'est-à-dire: des groupes de 4 bits pour chaque chiffre hexadécimal). Mais il peut toujours faire des maths comme montré ci-dessus. – 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

Vérifiez ci-dessous simple et facile -

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

Référence:Reverse number program in c#

1

fil vieux, mais je ne vois pas cette variation:

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

Je regardais la solution suivante. Mais qu'en est-il quand n est négatif?

n = Disons que -123456

Voici un tweak j'ajouté pour traiter les nombres négatifs, avec cette hypothèse il engourdit la même façon négative de la menace.

 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

solution la plus courte:

 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

Comme par Pritam Karmakar commentaire, Oui, cela ne fonctionne pas lorsque nombre donné a 0 à la fin. Si vous passez le numéro 150 comme il retournera 51 pas 051. donc je devais écrire du code pour afficher le numéro dans l'ordre inverse selon l'entrée d'utilisateur de vérifier cette s'il vous plaît.

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