2010-01-11 45 views
12

我遇到了一个问题:“如何将数字反转为整数而不是字符串?”任何人都可以请帮我找出答案。如何将数字反转为整数而不是字符串?

+1

定义“扭转数为整数” – 2010-01-11 08:50:46

+0

你能更准确? – 2010-01-11 08:50:46

+0

你的意思是:颠倒其十进制表示的数字? – 2010-01-11 08:50:52

回答

22

这应做到:

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

非常感谢,但我认为当给定的数字在0结束时这将不起作用。就像40 – 2010-01-11 13:45:27

+4

它仍然可以用数字0 – jerjer 2010-01-12 02:04:29

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

是这样的?

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

作为hackish的一行代码(更新:使用本杰明的评论,以缩短):

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

虽然单线是非常低效的。 – kennytm 2010-01-11 09:11:26

+0

当然,这就是为什么我称它为hackish。这更多的是好奇心。 – cfern 2010-01-11 09:12:50

+1

ToCharArray()是多余的,你也可以通过你的select在集合中进行int转换 - 保存水平空间。 :)请参阅下面的示例以了解纯字符串版本。 – 2010-01-11 09:13:19

4

乘以-1?精确您的问题,请...

+0

事实上,正如我在问题中提到的......我在一个网站上发现了这个问题,他们在那里发表了多个采访问题。所以我也对这个问题感到困惑。 – 2010-01-11 10:49:06

6

耶!一种闪闪发光的方式。 (不,真的。我希望这是更多的是“我会怎么做?”的问题,不是你真正需要的生产)

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

非常好的解决方案! – Flynn 2012-12-28 16:42:54

2

你不能。由于计算机在任何情况下都以十六进制表示,所以您需要将数字标记为阿拉伯语格式,这与转换为字符串的语义相同。

+0

@Alex:更准确地说,计算机的位和十六进制是精确的倍数(即:每个十六进制数字的4位组)。但是,如上所示,它仍然可以做数学。 – kriss 2010-04-12 14:30:35

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

检查下面简单和容易 -

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

参考:Reverse number program in c#

1

旧线,但我没有看到这种变化:

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

我看着以下解决方案。但是当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; 
0

最短的解决方案:

 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

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