2

次のようになる C# のカスタム番号システムの要件があります。

A - 1
B - 2
...
Z - 26
AA - 27
AB - 28

次のように、任意の文字列から数値に変換する関数を作成しました。

    private const int Min = 'A';
    private const int Max = 'Z';
    private const int Base = Max - Min + 1;

    private static int GetCharValue(char c)
    {
        if (c < Min || c > Max)
            throw new ArgumentOutOfRangeException(nameof(c), c, $"Character needs to be between '{Min}' and '{Max}', was '{c}'.");

        return c - Min + 1;
    }

    public static int GetStringValue(string s)
    {
        char[] chars = s.ToCharArray();
        int[] values = new int[chars.Length];
        for (var i = 0; i < chars.Length; i++)
        {
            values[i] = GetCharValue(chars[i]);
        }

        int position = 1;
        int value = 0;
        for (var i = values.Length - 1; i >= 0; i--)
        {
            value += position * values[i];
            position *= Base;
        }

        return value;
    }

私はそれが最大で動作することをテストしましたAAA(厳密ではなく、それらすべてを印刷した出力をざっと調べただけです)。ただし、逆関数の書き方は一生わかりません。言い換えれば、私は戻って、戻って、そして1戻る必要があります。「問題」は、この数体系には 0 がないため、基数に簡単に変換できないことです。たとえば、0 だった場合は 0でもありますが、そうではありません。では、どうすればこれを解決できますか?A26Z27AAAAA

4

1 に答える 1