2010-01-11 75 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();