1

以下のシナリオのロジックを手伝ってくれる人はいますか?

**Input -> Output**
00000 --> 00001
00009 --> 0000A
0000Z --> 00010
..
..
0002Z --> 00030
00039 --> 0003A

何か提案はありますか?

編集あなたの提案に感謝します。:)これは私が試したもので、うまくいきますが、何らかの条件で壊れるかどうかはわかりませんか?:/

    public static void Main(string[] args)
    {
        string number = "0001Z";            
        var result = Increment(number);

    }

    private static String Increment(String number)
    {
        String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";            
        char lastChar = number[number.Length - 1];
        string fragment = number.Substring(0, number.Length - 1);

        if (chars.IndexOf(lastChar) < 35)
        {
            lastChar = chars[chars.IndexOf(lastChar) + 1];
           string nextNumber = fragment + lastChar;
            return nextNumber;
        }
        return Increment(fragment) + '0';            
    }

PS:数字と文字(別名Base36数字)を使用するインデックスをインクリメントします-これは私が入手した場所なので、質問が重複する可能性があります..ごめんなさい。

4

1 に答える 1

1

整数を別の基数に変換するために作成したメソッドがいくつかあります。おそらく改善される可能性があると確信しています。しかし、彼らはあなたを始めるかもしれません。したがって、基数 36 の「数値」を int に変換し、1 ずつインクリメントしてから、基数 36 に戻します。この方法では再帰が使用されますが、これはおそらく必要ありません。もっと効率的な方法があれば知りたいです。

これらの方法では、0 ~ 9 と A ~ Z 以外の文字は想定されていません

void Main()
{
    string input = "0000Z";
    int value = baseToInt(input, 36);
    value++;
    string output = intToBase(value, 36).PadLeft(5, '0');

    Console.WriteLine("Input: {0}", input);
    Console.WriteLine("Output: {0}", output);
}

public string intToBase(int input, int @base)
{
    var digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    if (@base < 2 || @base > 36)
    {
        throw new ArgumentOutOfRangeException("base", "Must specify a base between 2 and 36, inclusive");
    }

    if (input < @base && input >= 0)
    {
        return digits[input].ToString();
    }
    else
    {
        return intToBase(input / @base, @base) + digits[input % @base].ToString();
    }
}

public int baseToInt(string input, int @base)
{
    var digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    if (@base < 2 || @base > 36)
    {
        throw new ArgumentOutOfRangeException("base", "Must specify a base between 2 and 36, inclusive");
    }

    var digitsInBase = digits.Substring(0, @base);

    if (input.Any(c => !digitsInBase.Contains(c)))
    {
        throw new ArgumentOutOfRangeException("input", string.Format("Input is not a valid base {0} number", @base));
    }

    return (int)input.Select((c, i) => Math.Pow(@base, input.Length - (i + 1)) * digitsInBase.IndexOf(c)).Sum();

}

出力:

入力: 0000Z
出力: 00010

于 2016-10-17T22:11:05.087 に答える