I came across a question "How can one reverse a number as an integer and not as a string?" Could anyone please help me to find out the answer.
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();
}
}
Something like this?
public int ReverseInt(int num)
{
int result=0;
while (num>0)
{
result = result*10 + num%10;
num /= 10;
}
return result;
}
As a hackish one-liner (update: used Benjamin's comment to shorten it):
num.ToString().Reverse().Aggregate(0, (b, x) => 10 * b + x - '0');
A speedier one-and-a-quarter-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;
}
It's not a one-liner because I had to include return 42;
. The C# compiler wouldn't let me compile because it thought that no code path returned a value.
P.S. If you write code like this and a co-worker catches it, you deserve everything he/she does to you. Be warned!
EDIT: I wondered about how much slower the LINQ one-liner is, so I used the following benchmark code:
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);
}
Result (10^6 random numbers in positive int32 range):
While loop version:
Operation took 279ms
Linq aggregate:
Operation took 984ms
This should do it:
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);
Yay! A bling way. (No, really. I hope that this is more a "How would I do..." question and not something you really need in production)
public int Reverse(int number) {
return int.Parse(number.ToString().Reverse().Aggregate("", (s,c) => s+c));
}
You can't. Since the computer thinks in hexadecimal in any case, it is necessary for you to tokenise the number into Arabic format, which is semantically identical to the conversion to string.
/// <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;
}