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? Reversal should reverse the
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();
I looked at the following solution. But how about when n is negative?
Lets say n = -123456
Here is a tweak I added to it to handle negative numbers, with that assumption it will threat negative numbs the same way.
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;
static void Main(string[] args)
{
Console.WriteLine("Please enter number");
int number = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(ReverseLoop(number));
Console.WriteLine(ReverseRecursive(number));
Console.ReadLine();
}
public static int ReverseRecursive(int number)
{
int remainder = number % 10;
number = number / 10;
if (number < 1)
return remainder;
return ReverseRecursive(number) + remainder * Convert.ToInt32(Math.Pow(10, number.ToString().Length));
}
public static int ReverseLoop(int number)
{
int reversed = 0;
while (number > 0)
{
reversed = reversed * 10 + (number % 10);
number = number / 10;
}
return reversed;
}
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
int x = 9876543;
char[] arr = x.ToString().ToCharArray();
Array.Reverse(arr);
Console.WriteLine(int.Parse(new string(arr)));
the shortest solution:
int reverse=0;
int number = 21;
while (number > 0)
{
reverse = number % 10;
Console.Write(reverse);
number = number / 10;
}