2016-11-21 14 views
1

私は、ユーザが言及した特定の行にパスカル三角形の結果を出力するという問題を解決しました。intをunsigned long longにキャスト

https://leetcode.com/problems/pascals-triangle-ii/

私は巨大な階乗結果を格納する問題を持っていた私の解決策を書きました。これらの質問を経由で

vector<int> getRow(int rowIndex) { 

      vector<int> v; 

      int C = 1; 
      v.push_back(1); 

       for (int i = 1; i <= rowIndex; i++) 
       { 
        printf("%d ", C); 
        C = C * (rowIndex +1 - i)/i; 
        v.push_back(C); 
       } 

    return v; 
} 

What range of values can integer types store in C++

How many bytes is unsigned long long?

といくつかの他のソースを経由するが、私は私に必要な結果を与えた以下の変更を行いました。

C = (unsigned long long)C * (rowIndex +1 - i)/i; 

「C」はタイプint型と私のベクトルv店int型であるので、私はなぜキャスト符号なしの長い長いが、まだ私に有効な結果を与えるだろう知りたいと思いました。

+1

ちょうど推測です...たぶん、 'i'で除算した後、値が' int'が完全で正当な値である領域に戻ってくるのでしょうか? –

答えて

3

サブ式C * (rowIndex +1 - i)は、オーバーフローの分割前に指定できます。 Cをより大きなデータ型にキャストすると、式全体がその型になり、乗算はオーバーフローしません。その後、iで除算した後、結果はintに再度変換されますが、除算のためにintの範囲内です。

これは現在持っている値にすぎないことに注意してください。あなたがさらに高い値を続けると、遅かれ早かれそのようなキャストで修正できないオーバーフローが発生します。

+0

私は、unsigned long long値をint変数に格納する方法を混乱させていました。 –

1

あなたは

(unsigned long long)C 

を言うときあなたはunsigned long long型C実際の変数を作っていません。これを行うときにちょうど言っているだけです。C(右側)をunsigned long longとして扱います。つまり、Cを保持し、(rowIndex + 1 - i)で乗算を保持する一時的な空間だけです。次に、その空間との分割は、その大きな空間で行われます。結果全体が整数が持つことができる値よりも大きかった場合、これはうまくいかないでしょう。

+0

intに私はdidntの最終的な値を実現するまで長すぎる符号なしlongcastingを心配していた範囲内に落ちる可能性があります... –

関連する問題