Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#代码问题:修订号和字母_C# - Fatal编程技术网

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

C#代码问题:修订号和字母,c#,C#,我正在尝试编写一个函数,它接受修订号(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 ... ... 号码名称

我正在尝试编写一个函数,它接受修订号(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 ... ... 号码名称 1A 2 B 3 C ... ... 25岁 26 Z 27 AA 28 AB 29交流电 ... ... 51日 52安兹 53巴 54 BB 公元前55年 ... ...
这看起来很简单,但我认为它可能涉及递归,我在这方面很糟糕。有什么建议吗?

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

例如:

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

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


int值10=53;
int base10=10;
字符串值26=“”;
int base26=26;
int输入=值10;
while(true)
{
int mod=输入/基准26;
如果(mod>0)
value26+=Map26SymbolByValue10(mod);//将2映射到“B”
其他的
value26+=Map26SymbolByValue10(输入);//将1映射到“A”
int rest=输入-mod*base26;
如果(输入
您可以使用模运算符和除法来获取代码。
比如55/26==2(即B)和55%26=3(即C)。它适用于两个字符。当字符数未知时,必须开始循环:


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

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

基于tanascius原始答案的递归版本(也未经测试):


我认为这与从列号计算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;
}
测试溶液:

if(value == 1)
  return "A";
StringBuilder result = new StringBuilder();
value--;
while(value > 0)
{
  result.Insert(0, 'A' + (value % 26));
  value /= 26;
}
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多个修订)。

看起来您需要的公式与Excel使用的公式相同,可以将行号作为行名。我记得不久前有一个问题引发了一场激烈的争论……
string x=abc[num%26];x+=这个(num%26)
或类似的东西。。(另请注意,
abc=char[a…z]
)除非你想要一种不优雅的方式:)是的,我知道,但只是一个开始。。您需要进行减法和除法,当然,实际上返回一些东西,而不是进行递归循环。另请参见:@tanascius-我已经意识到(并编辑了)它是反向的-但您仍然希望以任何方式使用模。什么是GetChar()--这是函数本身吗?如果是这样的话,为什么还要费心处理循环呢?最好只使用递归…它确实如此。我在VS2008下测试了它,得到了与提问者相同的结果。什么对你不起作用?对不起,我引入了一个bug复制。我对uint使用了相同的代码,并对参数进行了0值检查。
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;
}
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();
}