質問: %ld [%d]\n", n,m,nCm,count); printf("%.3fs\n", (double)(t2-t1)/CLOCKS_PER_SEC); return 0; } long int C(int n, int m){ c= calloc(n+1,sizeof(long int *)); int i, j; for(i= 0; i!=n+1; i++){ c[i]= calloc(i+1,sizeof(long int)); for(j= 0; j!=i+1; j++){ c[i][j]= none; } } long int r= C_(n,m); for(i= 0; i!=n+1; i++){ free(c[i]); } free(c); return r; } long int C_(int n, int m){ count++; if( m==0 ){ return 1; } if( m==n ){ return 1; } return C(n-1,m)+C(n-1,m-1); } 課題内容 組合せの数(2項係数)を計算する関数 long int C(int n, int m) を動的計画法を適用した 再帰呼出しで関数定義した場合に、与えられた 非負整数 n、 m を引数とする呼出し C( n, m ) 対して関数 C が呼び出される回数を数え、 2項係数の値とその呼出し回数を標準出力に書き出すプログラムを作れ。 プログラムの仕様はつぎの通りとする。 コマンドラインから呼出しの引数となる非負整数 n、 m が指定される。 具体的には、つぎの2通りの方法で指定される。 非負整数 n、 m がコマンドラインに直接に与えられる。 コマンドラインに3つの非負整数 n、m1、m2 が与えられる。 この場合は、m1 ≦ m ≦ m2 である全ての m に対してその小さい方から順に C(n, m) を呼び出す。 出力は、つぎの形式の1行として書き出すこと。 C(n, m)=u [c times] u は2項係数の値、 c はその呼出し回数 u と [ の間、c と times の間には、それぞれ空白1文字をおくこと。 実行例 コマンドライン入力 3 1 標準出力 C(3,1)=3 [6 times] コマンドライン入力 3 0 3 標準出力 C(3,0)=1 [2 times] C(3,1)=3 [6 times] C(3,2)=3 [6 times] C(3,3)=1 [2 times] コマンドライン入力 3 3 0 標準出力
回答: long int **c; がグローバルだからじゃないかな?