-4

我正在寻找 C# 中的例程,它在输入数字时给我以下输出:0 - A 1 - B 2 - C 3 - AA 4 - AB 5 - AC 6 - BA 7 - BB 8 - BC 9 - CA 10 - CB 11 - CC 12 - AAA 13 - 等等

我正在使用字母,所以它不会与零混淆。我见过其他例程,但他们会给我 BA 的价值 3 而不是 AA。

注意:我发现的其他例程是将基数为 10 的数字转换为 .NET 中的任何基数的最快方法?http://www.drdobbs.com/architecture-and-design/convert-from-long-to-any-number-base-in/228701167,但正如我所说,他们会给我的不是我想要的为了。

4

2 回答 2

1

基于来自https://stackoverflow.com/a/182924的代码,以下应该可以工作:

private string GetWeirdBase3Value(int input)
{
    int dividend = input+1;
    string output = String.Empty;
    int modulo;

    while (dividend > 0)
    {
        modulo = (dividend - 1) % 3;
        output = Convert.ToChar('A' + modulo).ToString() + output;
        dividend = (int)((dividend - modulo) / 3);
    } 

    return output;
}

代码应该很容易阅读。它本质上是逐个字符地迭代计算,直到被除数减少到 0。

于 2018-03-27T13:51:51.260 回答
1

系统之间的转换是基本的编程任务,逻辑与其他系统(例如十六进制或二进制)没有区别。请找到以下代码:

//here you choose what number should be used to convert, you wanted 3, so I assigned this value here
int systemNumber = 3;
//pick number to convert (you can feed text box value here)
int numberToParse = 5;
// Note below
numberToParse++;
string convertedNumber = "";
List<char> letters = new List<char>{ 'A', 'B', 'C' };
//basic algorithm for converting numbers between systems
while(numberToParse > 0)
{
    // Note below
    numberToParse--;
    convertedNumber = letters[numberToParse % systemNumber] + convertedNumber;
    //append corresponding letter to our "number"
    numberToParse = (int)Math.Floor((decimal)numberToParse / systemNumber);
}
//show converted number
MessageBox.Show(convertedNumber);

注意:我一开始没有仔细阅读并弄错了。我在之前的解决方案中添加了两行标有“Note below”的行:解析数字的递增和递减。递减使A(为零,因此在数字的开头省略)被视为相关的前导数字。但是这样一来,可以转换的数字被移位并从 1 开始。为了弥补这一点,我们需要在开始时增加我们的数字。

另外,如果你想使用类似的其他系统,你必须用字母扩展列表。现在我们有了 A、B 和 C,因为你想要基于 3 的系统。事实上,你总是可以使用完整的字母表:

List<char> letters = new List<char> {'A','B','C', 'D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

只有改变systemNumber

于 2018-03-27T13:26:47.837 回答