次のようになる 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でもありますが、そうではありません。では、どうすればこれを解決できますか?A
26
Z
27
AA
A
AA