C# 函数根据输入编号生成字母数字序列号
我正在尝试用C#开发一个例程,它将接受给定的输入整数,并根据预定义的可能字符集返回一个6个字符的字母数字字符串 可使用的字符有: “0123456789ABCDEFGHJKLMNPNPQRSTUVWXYZ”(请注意,字母“I”和“O”不在集合中。) 因此,如果输入为1,则输出应为“000001”,输入9将输出“000009”,输入10将输出“00000A”,输入12345将输出“000AP3”,依此类推 我很难想出一个解决这个问题的好办法。我知道我必须以艰难的方式来解决这个问题,所以我正在寻求帮助C# 函数根据输入编号生成字母数字序列号,c#,C#,我正在尝试用C#开发一个例程,它将接受给定的输入整数,并根据预定义的可能字符集返回一个6个字符的字母数字字符串 可使用的字符有: “0123456789ABCDEFGHJKLMNPNPQRSTUVWXYZ”(请注意,字母“I”和“O”不在集合中。) 因此,如果输入为1,则输出应为“000001”,输入9将输出“000009”,输入10将输出“00000A”,输入12345将输出“000AP3”,依此类推 我很难想出一个解决这个问题的好办法。我知道我必须以艰难的方式来解决这个问题,所以我正在寻求帮
谢谢 直接的解决方案是迭代地将输入值除以N(字符集的大小),每次取余数索引到字符集中,然后逐个字符构建输出字符串
internal class Program {
private static void Main(string[] args) {
int value = 38;
const string alphabet = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
string result = ToBase(value, alphabet);
Console.WriteLine(result);
}
private static string ToBase(int value, string alphabet) {
if (value == 0) return alphabet[0].ToString();
var result = new StringBuilder();
while (value > 0) {
int digit = value % alphabet.Length;
value = (value - digit) / alphabet.Length;
result.Insert(0, alphabet[digit]);
}
return result.ToString();
}
}
您执行零填充int value=12345;
int value = 12345;
string alphabet = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
var stack = new Stack<char>();
while (value > 0)
{
stack.Push(alphabet[value % alphabet.Length]);
value /= alphabet.Length;
}
string output = new string(stack.ToArray()).PadLeft(6, '0');
字符串字母表=“0123456789ABCDEFGHJKLMNPQRSTUVWXYZ”;
var stack=新堆栈();
而(值>0)
{
stack.Push(字母表[值%alphabet.Length]);
值/=字母表长度;
}
字符串输出=新字符串(stack.ToArray()).PadLeft(6,'0');
修改LukeH答案,以生成字母数字转换成字母数字,反之亦然
int value = 12345;
string alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var stack = new Stack<char>();
while (value > 0)
{
int index = value % alphabet.Length;
stack.Push(alphabet[index]);
value /= alphabet.Length;
}
string output = new string(stack.ToArray()).PadLeft(6, '0');
double intNumber = 0;
int charPos = 0;
for (var i = output.Length-1; i >=0;i--)
{
int val = output[i];
if (val >= 48 && val <= 57)
intNumber += (val - 48) * (Math.Pow(36, charPos++));
else if (val >= 65 && val <= 90)
intNumber += (val - 55) * (Math.Pow(36, charPos++));
}
int值=12345;
字符串字母表=“0123456789abcdefghijklmnopqrstuvxyz”;
var stack=新堆栈();
而(值>0)
{
int index=字母表长度百分比的值;
stack.Push(字母表[索引]);
值/=字母表长度;
}
字符串输出=新字符串(stack.ToArray()).PadLeft(6,'0');
双整数=0;
int charPos=0;
对于(var i=output.Length-1;i>=0;i--)
{
int val=输出[i];
如果(val>=48&&val=65&&val我看得出你想要领先0,但你是如何从12345获得AP3的?这就是需要拿出一些解决方案的原因。看看。哇——这是一个优雅的解决方案。非常感谢LukeH!在字母表的字符串中,I和O缺失了:P@X-编码员:是的,它们被故意省略了,和qu中一样埃斯蒂恩。