Int32 Digit Circular Shift Using C #

Users

I am trying to do a right or left shift of the Int32 digits (not a bit !!).

So, if the constant shift:

 123456789 

3

I have to get

 789123456 

Thus, the numbers are not lost, because we are talking about a circular shift. After a little testing, I came up with this method that works:

 static uint[] Pow10 = new uint[] { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, uint.MaxValue }; static uint RotateShift10(uint value, int shift) { int r = (int)Math.Floor(Math.Log10(value) + 1); while (r < shift) shift = shift - r; if (shift < 0) shift = 9 + shift; uint x = value / Pow10[shift]; uint i = 0; while (true) { if (x < Pow10[i]) return x + (value % Pow10[shift]) * Pow10[i]; i += 1; } } 

What I'm looking for should be an arithmetic solution, not a string conversion, and then a rotation. I also assume that:

  • Int32 does not contain 0 digits to prevent the loss of digits.
  • Int32 - non-negative number
  • A positive integer rotation should shift to the right, and a negative integer should shift to the left.

My algorithm already does all this, and I like to know if there is a way to fine-tune it a bit if there is a better arithmetic solution to the problem?

+5
source share
1 answer

Because I just can not resist the problem "must have an arithmetic approach": D, broken with the following:

  static uint RotateShift(uint value, int shift) { int len = (int)Math.Log10(value) + 1; shift %= len; if (shift < 0) shift += len; uint pow = (uint)Math.Pow(10, shift); return (value % pow) * (uint)Math.Pow(10, len - shift) + value / pow; } 

edit Also some test results

 foreach(var val in new uint[]{123456789, 12345678}) foreach (var shift in new[] { 3, -3, 1, -1, 11, -11, 18 }) { Console.WriteLine("Value {0} Shift {1} -> {2}", val, shift, RotateShift(val, shift)); } Value 123456789 Shift 3 -> 789123456 Value 123456789 Shift -3 -> 456789123 Value 123456789 Shift 1 -> 912345678 Value 123456789 Shift -1 -> 234567891 Value 123456789 Shift 11 -> 891234567 Value 123456789 Shift -11 -> 345678912 Value 123456789 Shift 18 -> 123456789 Value 12345678 Shift 3 -> 67812345 Value 12345678 Shift -3 -> 45678123 Value 12345678 Shift 1 -> 81234567 Value 12345678 Shift -1 -> 23456781 Value 12345678 Shift 11 -> 67812345 Value 12345678 Shift -11 -> 45678123 Value 12345678 Shift 18 -> 78123456 
+4
source

All Articles