代码之家  ›  专栏  ›  技术社区  ›  Matthew Jones

C#代码问题:修订号和字母

c#
  •  4
  • Matthew Jones  · 技术社区  · 16 年前

    我正在尝试编写一个函数,它接受修订号(int)并将其转换为修订名(string)。公式应产生类似于以下内容的输出:

    Number  Name
    1       A
    2       B
    3       C
    ...     ...
    25      Y
    26      Z
    27      AA
    28      AB
    29      AC
    ...     ...
    51      AY
    52      AZ
    53      BA
    54      BB
    55      BC
    ...     ...
    

    这看起来很简单,但我认为它可能涉及递归,我在这方面很糟糕。有什么建议吗?

    5 回复  |  直到 16 年前
        1
  •  6
  •   Graham    16 年前

    我认为这与从列号计算Excel列名相同:

    private string GetExcelColumnName(int columnNumber)
    {
        int dividend = columnNumber;
        string columnName = String.Empty;
        int modulo;
    
        while (dividend > 0)
        {
            modulo = (dividend - 1) % 26;
            columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
            dividend = (int)((dividend - modulo) / 26);
        } 
    
        return columnName;
    }
    
        2
  •  5
  •   user151323 user151323    16 年前

    我想你基本上需要把10倍数值系统中的一个数转换成26倍数值系统中的一个数。

    例如:

    53=B*26^1+A*26^0=[B][A]


    int value10 = 53;
    int base10 = 10;
    
    string value26 = "";
    int base26 = 26;
    
    int input = value10;
    while (true)
    {
        int mod = input / base26;
        if (mod > 0)
            value26 += Map26SymbolByValue10 (mod); // Will map 2 to 'B'
        else
            value26 += Map26SymbolByValue10 (input); // Will map 1 to 'A'
    
        int rest = input - mod * base26;
        if (input < base26) break;
        input = rest;
    }
    
        3
  •  2
  •   Aaron    16 年前

    我真的希望这不是家庭作业(未经测试的解决方案):

    if(value == 1)
      return "A";
    StringBuilder result = new StringBuilder();
    value--;
    while(value > 0)
    {
      result.Insert(0, 'A' + (value % 26));
      value /= 26;
    }
    

    string ConvertToChar(int value)
    {
      char low = 'A' + (value - 1) % 26;
      if(value > 26)
        return ConvertToChar((value - 1) / 26 + 1) + low.ToString();
      else
        return low.ToString();
    }
    
        4
  •  2
  •   Tara McGrew    16 年前

    测试溶液:

    private static string VersionName(int versionNum)
    {
        StringBuilder sb = new StringBuilder();
        while (versionNum > 0)
        {
            versionNum--;
            sb.Insert(0, (char)('A' + (versionNum % 26)));
            versionNum /= 26;
        }
        return sb.ToString();
    }

    我不会为此而费心使用递归。使用StringBuilder进行循环比在每次递归中连接字符串更有效,尽管您可能需要大量的修订才能注意到差异(4个字母足以容纳400000多个修订)。

        5
  •  1
  •   tanascius    16 年前


    比如55/26==2(即B)和55%26=3(即C)。它适用于两个字符。当字符数未知时,必须开始循环:

    [看看Aaron的解决方案,我的错了]