- 締切済み
プログラムの説明をお願いします!
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1319406053 の回答を参考にして、入力されたnに対するn!を求めるプログラムを作りました。(0<=n<10000) 実行して出力できたのですが、情けない話ですがプログラムがどう動いているのかがさっぱりわかりません。 どなたか解説をお願いします。 #include <stdio.h> int main(void) { int c[10000]; int i, j, t, n; for (i=0; i<9999; i++) { c[i] = 0; } c[9999]=1; scanf("%d", &n); for (i=1; i<=n; i++) { t=0; for (j=9999;j>=0; j--){ c[j] = c[j] * i + t; t = c[j] /10000; c[j] %= 10000; } } for (i=0; i<10000; i++) { /* (1) */ if (c[i] > 0) { break; } } printf("%d", c[i++]); for(i=i; i<10000; i++) { printf("%04d", c[i]); /* (2) */ printf("\n"); return 0; } 特に、 (1)ここの繰り返しは何をやっているのでしょうか? (2)なぜ4ケタ0詰めにするのでしょうか? よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- hanabutako
- ベストアンサー率54% (492/895)
単純に階乗の計算をするだけならgmpを使うという手もありますが。 http://okwave.jp/qa/q7109836.html
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
(1) のループも、一時的に削除してみれば、どういう効果があるかはわかると思います。 蛇足ですが、私としては、 > printf("%d", c[i++]); > for(i=i; i<10000; i++) { > printf("%04d", c[i]); /* (2) */ > printf("\n"); の for は、 > for(; i<10000; i++) { のほうが、より意図がわかるかなと言う気がします。
- wormhole
- ベストアンサー率28% (1626/5665)
適当にしか見てなかったので気づかなかったのですが (2)はそういうことか、納得。 感謝です>#2の方 (2)も結局は参考にしたソースに説明書いてありますね。
- Tacosan
- ベストアンサー率23% (3656/15482)
(2) だけ, だけど, 当然「そうしないと不都合があるから」ですな. 何が不都合かは, 実験すればわかる.
- wormhole
- ベストアンサー率28% (1626/5665)
参考どころか、そのままじゃ・・・ (1) 参考にされたもののコメントに書いてあります。 (2) ゼロパディングの4桁で揃えたかっただけかと。