0

这是一个问我的面试问题——itoa在不使用任何内置函数的情况下编写转换。

以下是我正在使用的算法。但是('0' + n % 10);抛出一个错误:

无法将字符串转换为 int

private static string itoa(int n)
{
    string result = string.Empty;
    char c;

    bool sign = n > 0 ? true : false;
    while (true)
    {
        result = result + ('0' + n % 10);  //'0' 
        n = n / 10;
        if(n <= 0)
        {
            break;
        }               
    }

    if(sign)
    {
        result =  result + '-';
    }

    return  strReverse(result);
}
4

3 回答 3

3

我不清楚你为什么要这样做;只需在您的整数上调用ToString 。您可以使用各种重载指定所需的任何格式。

于 2013-10-28T00:46:02.837 回答
0

('0' + n % 10)结果是一个int值,因此您应该将其转换回char. 您的代码还有其他几个问题,例如-在错误的一侧添加符号、使用负值等。

我的版本:

static string itoa(int n)
{
    char[] result = new char[11]; // 11 = "-2147483648".Length
    int index = result.Length;
    bool sign = n < 0;

    do
    {
        int digit = n % 10;
        if(sign)
        {
            digit = -digit;
        }
        result[--index] = (char)('0' + digit);
        n /= 10;
    }
    while(n != 0);

    if(sign)
    {
        result[--index] = '-';
    }

    return new string(result, index, result.Length - index);
}
于 2013-10-28T01:33:18.717 回答
0

正如@minitech 评论的那样,我们通常只是ToString()在 C# 中使用它。如果你真的想自己写算法,下面是一个实现:

public static partial class TestClass {
    public static String itoa(int n, int radix) {
        if(0==n)
            return "0";

        var index=10;
        var buffer=new char[1+index];
        var xlat="0123456789abcdefghijklmnopqrstuvwxyz";

        for(int r=Math.Abs(n), q; r>0; r=q) {
            q=Math.DivRem(r, radix, out r);
            buffer[index-=1]=xlat[r];
        }

        if(n<0) {
            buffer[index-=1]='-';
        }

        return new String(buffer, index, buffer.Length-index);
    }

    public static void TestMethod() {
        Console.WriteLine("{0}", itoa(-0x12345678, 16));
    }
}

它仅适用于int. 范围int-2147483648 to 2147483647,字符串表示中的长度最大为 11。

对于 C 中的签名itoachar * itoa(int n, char * buffer, int radix);,但是我们不需要在 C# 中传递缓冲区,我们可以在本地分配它。

当基数大于时,将“0”添加到余数的方法可能不起作用10;如果我没记错的话,itoa在 C 中支持多达 36 个基数,就像这个实现一样。

于 2013-10-28T01:55:27.880 回答