2011-07-28 59 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值。