6

メンバー、

私がやろうとしているのは、Int32(ビットではなく!!)の数字を右または左にシフトすることです。

したがって、定数をシフトすると:

123456789

3

私は取得する必要があります

789123456

循環シフトについて話しているので、桁が失われることはありません。少しテストした後、この方法を思いつきました。これは機能します。

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;
        }
    }

私が探している方法は、文字列変換と回転ではなく、算術ソリューションでなければなりません。また、次のことも想定しています。

  • Int32 値には、桁の損失を防ぐために 0 桁が含まれていません。
  • Int32 は負でない数値です
  • 正の Rotation 整数は右にシフトし、負の整数は左にシフトする必要があります。

私のアルゴリズムはすでにそれをすべて行っていますが、少し調整する方法があるかどうか、問題に対するより良い算術解決策があるかどうかを知りたいですか?

4

1 に答える 1

5

私は「算術的アプローチが必要」という課題に抵抗できないので:D 、次のことをいじりました:

    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;
    }

編集また、いくつかのテスト結果

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
于 2015-07-01T18:36:52.050 に答える