1

任何人都可以帮助解决以下场景的逻辑吗?

**Input -> Output**
00000 --> 00001
00009 --> 0000A
0000Z --> 00010
..
..
0002Z --> 00030
00039 --> 0003A

请问有什么建议吗?

编辑感谢大家的建议。:) 这是我尝试过的,它有效,但不确定是否会在某些情况下中断?:/

    public static void Main(string[] args)
    {
        string number = "0001Z";            
        var result = Increment(number);

    }

    private static String Increment(String number)
    {
        String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";            
        char lastChar = number[number.Length - 1];
        string fragment = number.Substring(0, number.Length - 1);

        if (chars.IndexOf(lastChar) < 35)
        {
            lastChar = chars[chars.IndexOf(lastChar) + 1];
           string nextNumber = fragment + lastChar;
            return nextNumber;
        }
        return Increment(fragment) + '0';            
    }

PS:增加一个使用数字和字符(又名 Base36 数字)的索引- 这是我从中得到的,所以可能是重复的问题..对不起。

4

1 回答 1

1

我有几种方法可以将整数转换为不同的基数/从不同的基数转换。我相信他们可能会得到改进。但他们可能会让你开始。因此,将您的基数 36“数字”转换为 int,递增 1,然后转换回基数 36。此方法使用递归,这可能不是必需的。我很想知道是否有更有效的方法。

这些方法假定除了 0-9 和 AZ 之外没有其他字符

void Main()
{
    string input = "0000Z";
    int value = baseToInt(input, 36);
    value++;
    string output = intToBase(value, 36).PadLeft(5, '0');

    Console.WriteLine("Input: {0}", input);
    Console.WriteLine("Output: {0}", output);
}

public string intToBase(int input, int @base)
{
    var digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    if (@base < 2 || @base > 36)
    {
        throw new ArgumentOutOfRangeException("base", "Must specify a base between 2 and 36, inclusive");
    }

    if (input < @base && input >= 0)
    {
        return digits[input].ToString();
    }
    else
    {
        return intToBase(input / @base, @base) + digits[input % @base].ToString();
    }
}

public int baseToInt(string input, int @base)
{
    var digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    if (@base < 2 || @base > 36)
    {
        throw new ArgumentOutOfRangeException("base", "Must specify a base between 2 and 36, inclusive");
    }

    var digitsInBase = digits.Substring(0, @base);

    if (input.Any(c => !digitsInBase.Contains(c)))
    {
        throw new ArgumentOutOfRangeException("input", string.Format("Input is not a valid base {0} number", @base));
    }

    return (int)input.Select((c, i) => Math.Pow(@base, input.Length - (i + 1)) * digitsInBase.IndexOf(c)).Sum();

}

输出:

输入:0000Z
输出:00010

于 2016-10-17T22:11:05.087 回答