簡體   English   中英

C#代碼問題:修訂號和字母

[英]C# Code Problem: Revision Numbers and Letters

我正在嘗試編寫一個帶有修訂號(int)的函數,並將其轉換為修訂名稱(字符串)。 該公式應產生類似於此的輸出:

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
...     ...

這看起來很簡單,但我認為它可能涉及遞歸,我很可怕。 有什么建議么?

我認為這與從列號中計算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;
}

我認為你基本上需要將10x數值系統中的數字轉換為26x數值系統中的數字。

例如:

53 = 5 * 10 ^ 1 + 3 * 10 ^ 0 = [5] [3]

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;
}

我真的希望這不是作業......(未經測試的解決方案):

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

基於tanascius原始答案(也未經測試)的遞歸版本:

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();
}

測試解決方案:

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個字母足以進行超過400,000個修訂)。

您可以使用模運算符和除法來獲取代碼。
像55/26 == 2(即B)和55%26 = 3(即C)。 它適用於兩個字符。 當你有一個未知的字符數時,你必須開始循環:

[看看Aaron的解決方案,我的錯了]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM