2011-07-28 12 views
3

私は順列をしようとしています。この場合5の5,4,3,2,1です。最終的には、それをintXクラスに格納できる100までのpermuteにします。計算は正常ですが、以下のスクリプトを使用して、出力のすべての個数を合計したいと思います。C#char計算の問題

so 5! = 5x4x3x2x1 = 120 ----> 1 + 2 + 0 = 3但し、下記の私のスクリプトは、出力147を与える:私が間違って

120 
1 
2 
0 
147 

何をしているのですか?私はすでにすべての変換を試みましたが、私は文字列[pointer]を使って始めました。別の配列などを試しましたが、それはすべて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

合計=合計* i; total * = iのように書くことができます。 –

答えて

6

問題は、あなたが数字

Convert.ToInt32(answerArray[x]) 

上記の行がchar 1を受け取り、それを変換に戻ってあなたのanswerArray要素を変換する方法ですint。これはintとして解析するのと同じではありません。 1はアスキー文字49なので、内部的にはcharは49のint表現を持ち、変換されたものです(これは何らかの処理ではなく型変換を行うためです)

同様に2 = 50 0 = 48だから合計147を得ることができます。

文字列を数値として解析するには、Integer.Parseを使用します。私は暗黙的にそれを解析する前に、文字を文字列に変換する必要がありますと信じています。

だからあなたのループは次のようになります。あなたはまた、それを他の人が引い文字で提案する方法を行うことができます

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より高いなどです。

もちろん、これは1桁の文字でのみ機能します。 2桁以上の数字を文字列からintに変換する場合は、int.parseが必要です。

文字の減算方法が効果的なのは、非常に単純な型変換と減算を行っているので、私はその価値があると思います。パースメソッドはもっと多くのことを行う可能性がありますので、少し重いです。私はあなたがパフォーマンスの違いに気づくでしょう。

+0

Ahhhh、言語に新しいIm ...印刷されたintは、私がそれを変換したときに、私は物を得る。ありがとう。スーパー! –

+0

@ハンス:なぜ明らかに機能しないのかを覚えておく理由は、あなたのチャーが「z」または「;」になる可能性があるということです。あなたの方法はそれのために働かないでしょう。私はそれが賢明な方法で数字に文字列を変換することができますが、それはjavascriptに似ることができると思います。そうではなく、まったく異なる巧みなやり方で行われます。 :) – Chris

2

(INT) '0' を使用すべきである0に等しくない((INT)answerArray [X] - (INT) '0')

+0

int変換は実際には不要です。 char - charは暗黙的にintです。 –

+0

char - charは暗黙的にはintですが、intとは見えません。 – FlyingStreudel

+0

@FlyingStreudel:彼らはintsではないとはどういう意味ですか? '' 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

なぜそれを文字配列に変更するのですか?あなたはすでに必要な情報を持っています。

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

良い点。これは、厳密に質問に答えるわけではありませんが、よりエレガントになります。 :) – Chris

1

Convert.ToInt32は、合計が147として出てくる理由です49、50および48あるUnicode文字1の値は、2と0を返します。