2
#include <stdio.h>
long factorial(int num)
{
    int counter;
    int fact = 1;
    for (counter = num; counter > 0; counter--) fact *= counter;
    return fact;
}

float combinations(int n, int k)
{
    int numerator = factorial(n);
    int denominator = factorial(k) * factorial(n-k);
    float fraction = numerator/denominator;
    return fraction;
}
int main()
{
    printf("How many rows of Pascal\'s triangle should I print?\t");
    int rows = GetInteger();
    int counter;
    int counter2;
    for (counter = 1; counter <= rows; counter++)
    {
        int y = rows-counter;
        for (; y > 0; y--) printf("   ");
        for (counter2 = 0; counter2 <= counter; counter2++)
                printf("%6.0lu", (long) combinations(counter, counter2));
        printf("\n");
    }
}

12行を超えるたびに、数が減り始めます。私は何が間違っているのですか?

そして、いくつかの修正を加えたGetInteger()だけです。scanf()私はそれが完全に機能すると100%確信しています。

4

3 に答える 3

4

12行目以降、階乗のようにパスカルの三角形の要素が大きくなりすぎて、int型がそれらを保持できなくなるため、オーバーフローが発生します(おそらく、取得する値は最大int値にラップされます)。

PSなぜコードで3つの異なるタイプ(long、int、float)を使用するのですか?k!*(nk)!常にnを除算します!浮動小数点値は必要ありません(とにかく整数除算を使用して結果をlongにキャストします)。可能な最大の整数型、または任意の長さの整数を保持できるカスタムBigInt型を使用するだけで、大きな行番号の正しい値を表示できます。

于 2011-03-02T15:40:58.723 に答える
3

階乗から始めないでください。パスカルの三角形に関する次の事実から始めます。

  1. 三角形のn番目の行にはn個の要素があります(1から数え始めた場合)
  2. 各行の最初と最後の要素は1です
  3. 最初と最後の要素を除く各要素は、その上に対角線上にある2つの要素の合計です(三角形が対称的に書かれている場合)

もちろん、結果を保持しているデータ型のサイズによって制限されますが、必要以上に早くはなりません(階乗などの中間結果によって)。

于 2011-03-02T15:52:05.443 に答える
2

INT_MAXは通常2,147,483,64712です
!は479,001,60013
です!は6,227,020,800ですが、関数factorial(13)は1,932,053,504(= 6,227,020,800-4,294,967,296)を返します。

于 2011-03-02T15:52:38.643 に答える