如何在网络中将基数为10的数字转换为3基数(特例)

时间:2018-03-27 13:09:50

标签: c# .net number-systems

我在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。

注意:我发现的其他例程是Quickest way to convert a base 10 number to any base in .NET?http://www.drdobbs.com/architecture-and-design/convert-from-long-to-any-number-base-in/228701167,但正如我所说,他们不会给我我正在寻找的内容。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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。