• ベストアンサー

Nの階乗

この問題がどうすればいいのかまったくわかりません。 考え方を教えて下さい。 ------------------------------------------------ まず、プログラムの中で一つの整数N(1<=N<=100)を入力させる。そして、一桁ずつを一つの整数配列の別々の箱に入れる表現を用いて、Nの階乗を計算し、その結果を表示するプログラムを作れ。例えば1258をdat[4]=1, dat[3]=2, dat[2]=5, dat[1]=8と表す。アルゴリズムには、ループ(for文、while文、repeat文のいずれか)を用いなさい。

質問者が選んだベストアンサー

  • ベストアンサー
  • nitscape
  • ベストアンサー率30% (275/909)
回答No.2

同じような考え方で解く方法が過去にいくつかあります。ソースもありますので参考にどうぞ。

参考URL:
http://www.okweb.ne.jp/kotaeru.php3?q=429203,http://www.okweb.ne.jp/kotaeru.php3?q=92562

その他の回答 (2)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

階乗を求めるわけですから、掛け算だけを考えればいいわけですね。 この場合、配列に一桁ずつ値を入れて、それぞれ計算しろということなので、紙の上で「筆算」をするのを思い浮かべるとわかりやすいと思います。 例えば、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)
回答No.1

 私も以前100桁の数を無理やり扱ったことがあります。  具体的には、ずべてひと桁の計算に分解できるようにする必要があります。計算方法としては、 ・160個の16bit整数型(short intなど)配列を作る。 ・配列の一番初めに1を入れる。 ・普通に掛け算させる。 ・一桁かける2桁は、最大でも3桁にしかならないので、n番目の計算で100の桁があればn+2番目にその数をいれて掛け算した値から100の桁をなくす ・同様に10の桁ならn+1番目に入れて10の桁を消す・これで一桁になる。 ・これをひたすらループさせて計算結果を出します。 オーバーフローを起こすようなら、配列の個数を増やします。

関連するQ&A

  • 階乗の式

    「5」と入力すると、「1*2*3*4*5=120」(階乗)と表示されるプログラムを組みたいのですが、 例で言うと120という計算結果は出せるのですが式の部分が出せません。 forまたはwhileによって作るんですが誰か式をうまく出すプログラムが分かる人いらっしゃいませんか?

    • ベストアンサー
    • Java
  • 配列の使い方分かりません

    //整数型の配列を10個準備する。 //ループ文を用いてキーボードから値を10個入力する。(for文を用いる) //入力した値を出力する。 //ループ文を用いて入力値の合計と平均値を求める。(while文を用いる) 以上の課題が出されました。 配列の使い方が分からないので上手くできません。 説明付だとうれしいです。よろしくお願いします。

  • 100の階乗のプログラムって

    100の階乗を配列を利用してプログラムを組みたいのですが、どうやってすればいいのか分かりません。やりたい方法としては、数値を入力して、1から順番に入力して数値までかけて行きたいです。その中で、繰り上がり(agari)を利用して、人間が筆算をしているのと同じやり方をして計算したいです。掛けられる数は2桁でも一気にかけます。よろしくお願いします。 #include<stdio.h> #define N 200 void main(void) { int a,agari,h,i,j; int su[N]; printf("数値を入力してください"); scanf("%d",&a); for(i=0;i<N;i++){ su[i] = 0; } su[N-1] = 1; agari = 0;   ここから先が分かりません。

  • VB.NETで階乗を求めるプログラムを作成する

    再帰を使わず、For文による繰り返しにより、階乗を求めるプログラムを作成したいのです。 ↓ここからどうすれば良いか、ご教授お願い致します。 Dim n , i As Integer n = Textbox1.Text For i = 1 To n n = n * ( n - 1 ) Next Textbox2.Text = n

  • C言語の質問です。

    プログラムを書こうとしているのですが、行き詰まるっているのでアドバイスください。 ○データ 0 0 1 2 2 3 4 5 5 5 8 8 10 10 ・ ・ ・ このような整数がだんだん増えていく(1万以上の整数まで増えていく)書式のデータがあるとします。 僕の作りたいプログラムは 一万個以上あるすべてのデータを読み込んで個数を出す。というものです。 言葉で表現するのが難しいので例を出しますと 最終的にほしいものは データをすべて読み込んで 同じ整数がない整数の個数 同じ整数が2つの整数の個数 同じ整数が3つの整数の個数      ・      ・ 同じ整数が10つの整数の個数      ・      ・    このような情報がほしいと考えています。 例のデータで考えますと 同じ整数がない整数 =3 同じ整数が2つの整数=4 同じ整数が3つの整数=1 になります。 私が考えているやり方の手順 (1) データを読み込む (2) 読み込んだ整数のそれぞれのすべての個数を出す。    例:1=2個 15=1個 289=3個  (3) 出した個数の数を数えて出力。 という流れです。 私が行き詰まっているプログラム int main(void) { int i, n, hako[?];  ←1万個以上あるので箱を何個用意すればいいかわかりません   // n は読み込んだデータ。 FILE *fp;         配列を使おうと思っているのですが。。。 fp=fopen("FILENAME","r"); ←データの読み込み if(fp==NULL) { printf("file open error!!\n"); exit(1); } for(i=1;i<?;i++);  ←すべての箱をゼロクリアしたいのですが箱の個数がわかりません hako[i]=0; while(fsacanf(fp, "%d\n", &n)!=EOF){ if(i>n){hako[i]++;}  if(i=n){ i++; hako[i]++; } printf("%d = %d\n", i ,hako[i]); } fclose(fp); return 0; } とりあえずは流れ(2)までのプログラムを書きたいと考えています。 配列が苦手なので混乱しています。 配列のhako[]のところで間違っていると思うのですがよくわからないので質問してみました どうぞよろしくお願いします。

  • C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに

    C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに困っています。 以下の点に留意して、階乗を計算するプログラムを作成する。 階乗とは、数字を1つづつ減らしながら掛け合わせたものです。つまり 5の階乗:5×4×3×2×1=120 3の階乗:3×2×1=6 となります。 main内 1)整数型の変数kazu、kekkaを宣言する。 2)“階乗を計算します。”を表示する。 3)実行例と同様の表示になるように、“整数を入力してください”を表示し、入力された値を、変数kazuに読み込む。 4)作成する関数名は、kaijyoとし、kazuを引数とし、戻り値をkekka に代入する。 6)“○の階乗は ○です。”と表示する。 関数kaijyo内 1)引数を変数名xとする。 2)整数型の変数i、valを宣言する。 3)計算結果をvalに入れていくために、valを初期化する(下記注意参照)。 4)iをカウンターとするfor文と複合代入演算子を使って階乗を計算する。 5)valの内容が戻り値となるようにする。 注意:階乗を計算するために、for文の中で複合代入演算子を使って階乗を計算します。しかし、for文に入る前のvalの初期化には注意が必要です。0に何を何回かけても0だと言うことを思い出してください。 という問題です。 それで私は下の通りに作りました。 #include <stdio.h> int kaijyo(int x); void main(void) { int kazu,kekka,kaijyo,sum; printf("階乗を計算します。\n"); printf("整数を入力してください"); scanf("%d",&kazu); kekka=kaijyo(kazu); printf("%dの階乗は%dです。",kazu,kekka); } int kaijyo(int x) { int i,val; val=1; x=1; for(i=1;i<=val;i++){ x=x*i; } return val; } しかし、メイクして実行してもどの階乗でも256になってしまいます。 どこが間違っているのか分からずに困っています。 よかったら教えてください。 よろしくお願いします。 カテゴリを間違ってしまっていたらすみません。

  • C言語について質問です。

    C言語について質問です。    問題:繰り返し命令と階乗の計算 カウンタ用変数nの値を1から10まで1ずつ変化させて、その値を階乗用変数Kiに順次、掛け算していき、10の階乗を求めよ。 ki=1×2×3×4×5×6・・・・・×9×10 <==10! また、1/n!は小数点以下10桁まで求めよ。 実行結果は    n                 n!             1/n!    1                 1             1、0000000000    2                 2             0、5000000000    3                 6             0、1666666667    4                24             0、0416666667    5               120             0、0083333333    6               720             0、0013888889    7              5040             0、0001984127    8             40320             0、0000248016    9            362880             0、0000027557   10           3628800             0、0000002756                            続行するには何かキーを押してください、、、、、、 上のように実行結果が出るようにプログラミングしたいのですがわからないので 分かる方よろしくお願いします。 ちなみに今まで習ってきたのは、if文、switch文、do文、while文、for文なんですがこのプログラミングは、for文でおねがいします。 長文失礼しました。

  • 再帰処理を用いて階乗を求めるプログラム

    こんにちは 再帰処理を用いて階乗を求めるプログラムについて の質問です。 以下のように考えたのですが、 まったく駄目なようです。 どこをどのように直したらいいのか いまいちわかりません。 どなたか教えて下さい。お願いします。 Private Sub CommandButton1_Click() Dim n As Integer 階乗する数 Dim f As Integer 階乗する数の階乗した値 n = Val(TextBox1)   Do While f > 1 KEISAN n, f Loop TextBox2 = f End Function Function KEISAN(n, f) If n <= 1 Then f = 1 Else f = n * f(n - 1) End If End Function

  • C言語のプログラムについて

    C言語のプログラムについて 3桁の自然数の中で、自分自身を含めた約数が奇数になるものがいくつあるかを求めるプログラムを作りたいのですが、swich文を使って、6通りの方法で出そうとしていまして、 while 文、 for文、 do while文に加え、 for文のを、1つの関数として独立させたもの、 さらに、for文のを重ループ部分のそれぞれのループに対応して、2つの関数として独立させたもの、 そして、この2つの関数のどちらともをループを用いずに再帰呼び出しを用いたもの の6通りで出したいのですが、swich文を使うところは自力でできたのですが、あとの6つそれぞれのプログラムの組み方がわかりません。 教えていただけないでしょうか?ややこしい書き方をしてすいません・・・。

  • 階乗の出力について

    Cを勉強中の者です。再起コールを使った階乗計算の結果を出力するプログラムをつくったのですが、もし再起コール(関数 kaijyo)を使わずにfor文などを使って同じように、階乗計算を行いたい場合どのようにすればいいでしょうか? 以下がそのソースコードです。説明が不足であればまた付け加えますのでよろしくおねがいします。 #include <stdio.h> int kaijyo(int a); int main(void) { int a; a = kaijyo(6); printf("6! = %d\n", a); return 0; } int kaijyo(int n) { if(n == 1) return 1; else return n*kaijyo(n-1); /*これを使わずに6!の結果を出したい/* }

専門家に質問してみよう