1

これは私が以前に割り当てられた宿題プロジェクトです...私はこれまで自分で成功しました、そして私が残した唯一の問題はデータ型とオーバーフローの問題です(私は信じています)。

unsignedとdoubleに切り替えてみましたが、コードは準拠しており、ターミナルでの入力を受け入れますが、その後ハングアップするようです...何も出力されず、ループに巻き込まれているように見えます。

これがコードです...

    /* pascaltri.c
     * A program that takes a single integer as input and returns the nth line of
     * Pascal's Triangle. Uses factorial() function to help find items of
     * individual entries on a given row.
     */
    #include <stdio.h>
    #include <stdlib.h>
    long factorial(long i) 
    {
        long fact = 1;

        while(i > 1)
        {
            fact = fact * i;
            i = i - 1;
        }
        return fact;
    }
    main(void)
    {   
        long n;
        long *nPtr;
        nPtr = &n;
        scanf(" %i", nPtr); 
        if (n >= 0)
        {
            long k;
            long *kPtr;
            kPtr = &k;                
            for(k = 0; k <= n; k++)
            {
                long ans;
                long *ansPtr;
                ansPtr = &ans;

                ans = factorial(n) / (factorial(k) * factorial(n - k));
                printf("\n %i", ans);
            }
            return 0;
        }
        return 0;
    }

完璧でもきれいでもありませんが、三角形の入力13(つまり、行14)まで機能します。それを超えて、私はぎこちなくなり始め、戻り値全体に負の値が散らばっています...はるかに大きな値はコードを壊し、終了エラーメッセージだけを返します。

この問題を修正する方法について何かアイデアはありますか?私は自分で何かを実際に見るために、ずっと長い間画面を見つめてきました。また、必須ではありませんが、戻り値を改行文字で区切るのではなく、1行に出力したいと思います。

1 5 10 10 5 1

計算時に値を配列にロードしてから、配列を出力するのが最も簡単な方法でしょうか。または、printステートメントを1行だけで発生させるように指示できる組み込みの方法はありますか?

4

3 に答える 3

2

ガベージの場合、整数のオーバーフローが発生している可能性があります。つまり、計算された値がlongデータ型に対して大きくなりすぎます。n!を明示的に計算せずに、階乗関数を計算して修正する必要があります。

于 2011-09-30T08:39:31.220 に答える
2

あなたは整数のオーバーフローに苦しんでいます。大きな数を計算する必要をなくすために、アルゴリズムへの別のアプローチを見つける必要があるかもしれません。

\n改行に関する他のポイントに答えて、printステートメントでinを使用して改行を明示的に印刷しています。それを削除すると、回答が1行に印刷されます。printf("\n");行全体が改行で終了するように、最後にファイナルを含めることをお勧めします。

他のいくつかの観察:

  • 最初のものは必要ありません-コントロールはブロック return 0;の下部から2番目(のみである必要があります)にドロップし、問題を引き起こしません。ifreturn 0;
  • kPtrを宣言していますが、どこでも使用していません
  • に渡すために別の変数nPtrを宣言する必要はありませんscanf。直接渡すことができます&n
于 2011-09-30T08:43:34.200 に答える
1

scanf(" %i", nPtr);に変更

scanf(" %ld", nPtr); 

printf("\n %i", ans);

printf("\n %ld", ans);

1行で印刷するには、次を使用します。

printf(" %ld", ans);

を使用している場合はgcc、警告をオンにします。つまり、を使用します-Wall

于 2011-09-30T08:46:33.307 に答える