C#char计算问题

时间:2011-07-28 15:33:29

标签: c#

我试图做一个排列。在这种情况下五个,所以5,4,3,2,1。最终我希望它可以存储多达100个,可以存储在我的i​​ntX类中。计算很好,但我想使用下面的脚本将输出的所有单个数字相加。

所以5! = 5x4x3x2x1 = 120 ----> 1 + 2 + 0 = 3.但我的下面的脚本给出了输出147:

120
1
2
0
147

我做错了什么?我已经尝试了所有转换器,我开始只使用字符串[指针]东西,我尝试了不同的数组等...但它一直在提出147.它是某种表示的东西吗?

    static void Main(string[] args)
    {
        IntX total=1;
        IntX totalsum = 0;
        int perm = 5;
        for (int i = perm; i > 0; i--)
        {
            total = total * i;
        }
        Console.WriteLine(total);

        string answerstring = Convert.ToString(total);
        char[] answerArray = answerstring.ToArray();
        for (int x = 0; x < answerArray.Length; x++)
        {
            totalsum += Convert.ToInt32(answerArray[x]);
            Console.WriteLine(answerArray[x]);
        }
        Console.WriteLine(totalsum);
    }

6 个答案:

答案 0 :(得分:6)

问题出在这里:

for (int x = 0; x < answerArray.Length; x++)
{
    //Casting char to int, not what you want!
    //totalsum += Convert.ToInt32(answerArray[x]);
    //Parsing char to int, what you do want!
    totalsum += int.Parse(answerArray[x]);
    Console.WriteLine(answerArray[x]);
}

答案 1 :(得分:6)

问题在于您将answerArray元素转换回数字的方式

Convert.ToInt32(answerArray[x])

上面的行使用char 1并将其转换为int。这与将其解析为int不同。 1是ascii字符49所以在内部char的int表示为49,因此它被转换为(因为这只是尝试进行类型转换而不是任何类型的处理)

同样地,2 = 50和0 = 48,所以你得到的总数为147。

您要做的是使用Integer.Parse将字符串解析为数字。我相信它应该在解析之前隐式地将char转换为字符串。

所以你的循环将是:

    for (int x = 0; x < answerArray.Length; x++)
    {
        totalsum += int.Parse(answerArray[x].ToString());
        Console.WriteLine(answerArray[x]);
    }

您也可以像其他人建议的那样减去字符。这是有效的,因为ascii值1比ascii值高1,等于2,等等。

当然这仅适用于单位数字符号。如果您想要将超过两位数的数字转换为字符串中的int,则需要int.parse

值得我怀疑的是,字符减法方法是最有效的,因为它实际上只是做了一些非常简单的类型转换和减法。解析方法可能会做更多的东西,所以更重量级。我不会'你会注意到性能差异。

答案 2 :(得分:4)

尝试使用answerArray[x] - '0',而不是转换为整数(将采用ASCII字符值)。

答案 3 :(得分:2)

(int)'0'不等于0.你应该使用((int)answerArray [x] - (int)'0')

答案 4 :(得分:2)

为什么要将它更改为char数组呢?您已经拥有了所需的信息。

while (total > 0)
{
    ones_digit = total % 10;
    totalsum += ones_digit;
    total -= ones_digit;
    total /= 10;
}

答案 5 :(得分:1)

Convert.ToInt32返回字符1,2和0的Unicode值,即49,50和48.这就是为什么总和为147。