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 ... ... 号码名称 1A 2 B 3 C ... ... 25岁 26 Z 27 AA 28 AB 29交流电 ... ... 51日 52安兹 53巴 54 BB 公元前55年 ... ...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 ... ... 号码名称
这看起来很简单,但我认为它可能涉及递归,我在这方面很糟糕。有什么建议吗?我想你基本上需要把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();
}