2011-07-28 60 views
3

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

所以5! = 5x4x3x2x1 = 120 ----> 1 + 2 + 0 = 3,但低于我的脚本给输出147:

120 
1 
2 
0 
147 

我在做什么错?我已经尝试过所有的转换器,我开始只使用字符串[指针] thingy,我尝试了不同的数组等等。但它一直持续到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); 
    } 
+0

total = total * i;可以写成总数* = i; –

回答

6

的问题是要转换的answerArray元素回数

Convert.ToInt32(answerArray[x]) 

上面一行取炭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]); 
    } 

你也可以做到这一点其他的方式与字符减去建议。这是有效的,因为1的ascii值比0的ascii值高1,2是2高等。

当然,这只适用于单数字字符。如果你想要从一个字符串转换两个以上的数字为int,你需要int.parse

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

+0

Ahhhh,Im新语言......有些人认为打印的int是当我转换它时,事物ID会增加。谢啦。超!我必须等6分钟才能回答 –

+0

@Hans:记住为什么显然不能工作的原因是你的字符可能是'z'或';'而你的方法对此不起作用。我想它可以做类似于JavaScript的地方,它可以以聪明的方式将字符串转换为数字,但事实并非如此。或者更确切地说,它以完全不同的聪明方式。 :) – Chris

2

(int)的 '0',不等于0,则应使用((int)的answerArray [X] - (int)的 '0')

+0

int转换实际上是不必要的; char - char是隐式的int。 –

+0

char - char是隐式的int,但不是它们看起来的整数。 – FlyingStreudel

+0

@FlyingStreudel:你的意思不是它们看起来像是什么? ''5' - '0''等于'5'不是吗? – Chris

4

代替转换为整数(其中将采用ASCII字符值),请尝试使用answerArray[x] - '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]); 
} 
2

为什么要把它改为char数组?你已经有了你需要的信息。

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

好点。虽然不严格回答这个问题,但这会更加优雅。 :) – Chris

1

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