- ベストアンサー
Nの階乗
この問題がどうすればいいのかまったくわかりません。 考え方を教えて下さい。 ------------------------------------------------ まず、プログラムの中で一つの整数N(1<=N<=100)を入力させる。そして、一桁ずつを一つの整数配列の別々の箱に入れる表現を用いて、Nの階乗を計算し、その結果を表示するプログラムを作れ。例えば1258をdat[4]=1, dat[3]=2, dat[2]=5, dat[1]=8と表す。アルゴリズムには、ループ(for文、while文、repeat文のいずれか)を用いなさい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
同じような考え方で解く方法が過去にいくつかあります。ソースもありますので参考にどうぞ。
その他の回答 (2)
- UKY
- ベストアンサー率50% (604/1207)
階乗を求めるわけですから、掛け算だけを考えればいいわけですね。 この場合、配列に一桁ずつ値を入れて、それぞれ計算しろということなので、紙の上で「筆算」をするのを思い浮かべるとわかりやすいと思います。 例えば、1528×3の計算を筆算するとき、 1528 3 -------- 24 6 15 3 -------- 4584 という風になると思います。 3×8=24 3×2=6 3×5=15 3×1=3 という風にそれぞれ掛けたあと、足し算をして繰り上がりの部分を計算する。 ……というのが大まかな考え方です。 ポイントは「一桁ずつ掛ける」ことと「掛けた後の繰り上がりをうまく調整する」ことですね。
- 12m24
- ベストアンサー率23% (193/817)
私も以前100桁の数を無理やり扱ったことがあります。 具体的には、ずべてひと桁の計算に分解できるようにする必要があります。計算方法としては、 ・160個の16bit整数型(short intなど)配列を作る。 ・配列の一番初めに1を入れる。 ・普通に掛け算させる。 ・一桁かける2桁は、最大でも3桁にしかならないので、n番目の計算で100の桁があればn+2番目にその数をいれて掛け算した値から100の桁をなくす ・同様に10の桁ならn+1番目に入れて10の桁を消す・これで一桁になる。 ・これをひたすらループさせて計算結果を出します。 オーバーフローを起こすようなら、配列の個数を増やします。