• 締切済み

階乗

数列{an}=n!となるようなプログラミングを作りたいのですが、そのやり方がいまいち分かりません。 int a, n, i, k; k=1; a=k*i;  ・・・・(1) for(i= 1; i<= n; i++); とすると a=i になっていしまい階乗にならないんですよ。(1)がおかしいのは分かるのですがどうしたらいいのかが分かりません。 ようはan=n*a(n-1) の形にして繰り返したいんですがどうしたらいいですか? C言語の根本的なやり方が分かってなくてすいません!!

みんなの回答

回答No.3

nをキーボードから入力するのであれば、 int n,i,a; scanf("%d",&n); a=1; for(i=1;i<=n;i++){ a=a*i;} とすればいいのではないでしょうか?

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 実際に動かしていませんが、a0123456789 さんのおっしゃられているように 再帰呼び出しを使用する方法と、自力で計算させる方法があります。 [再帰呼び出しのプログラム] int fact(int n) {  return((0 == n) ? 1 : n*fact(n-1)); } [自力で計算するプログラム] int fact(int n) {  int loop, ret;  for (loop = 1, ret = 1; loop <= n; loop++, ret *= loop);  return(ret); } になると思います。 再帰を使った方がプログラムは分かり易いですが、実行性能は 自力でやった方が早いです。 まぁ、状況によって使い分けて下さい。

回答No.1

int a(int n) { return((n==1)?1:n*a(n-1)); } のような関数を定義しては?

関連するQ&A

  • C言語の、階乗を使うプログラムの問題を教えて下さい

    C言語の、このプログラムを作るのが分かる方、教えて下さい。階乗を使う問題です。 「キーボードで整数aを入力するとn!>aとなるときの最小のnを出力するプログラムを作りなさい」という問題です。 分からず苦戦しています。 nをキーボードで入力してn!を求めるには #include<stdio.h> int main(void) { int kekka,n,i; printf("n=? \n"); scanf("%d",&n); kekka=1; for(i=1;i<=n;i++) { kekka=kekka*i; } printf("%d!は%dです。\n",n,kekka); return 0; } とすればいいのは自分で作れたのですが、問題にあるn!>aのプログラムが分からず困っています。 分かる方、お願いいたします

  • 階乗の出力について

    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!の結果を出したい/* }

  • C#でmCnの求め方について 階乗、組み合わせ

    C#の勉強を始めて数日の初心者です。 8個の中から4個を選ぶ組み合わせ 式1      m! mCn = ――――     n!(m -n)! 式2    m×(m-1)×(m-2)×…×(n+1) mCn = ――――――――――――       (m-n)! ---------------------------------------------- 勉強している本の中で、VBSctiptで式2を下記のような 記述例がありましたが、これをC#で書き換えると どのようになりますか? VBScriptの内容は全然分かりません。 メソッドの再帰呼び出し等は使わず、 あくまで、For文のみを使ってC#で記述したいです。 m = CInt(InputBox("何個の中から?")) n = CInt(InputBox("何個を選びますか?")) C = 1 For i = m To (n + 1) Step -1 c = c * i Next For i = (m - n) To 1 Step -1 c = c / i Next MsgBox "組み合わせ = " & CStr(c) ---------------------------------------------- 8個の中から4個を選ぶ組み合わせ 自分で書いてみたのですが、上記の式2のVBScriptの例に のっとった記述方法ではない感じがします。 int m = 8; int n = 4; int c = 0; for (int i = 1; i <= m; i++) { c = c * m; // mの階乗を求める } for (int i = 1; i <= n; i++) { d = d * n; // nの階乗を求める } e = d * d; // これの意味がよく分かりません。 f = c / e; Console.WriteLine(f); // 70 よろしくお願いします。

  • 階乗のプログラム

    c言語初心者です。 13までの階乗の値を計算するプログラムを下のように書いたのですが、 #include <stdio.h> main() { int N, fact; fact=1; for(N=1; N<=13; ++N){ fact=fact*N; printf("%d!=%d\n",N, fact); } } このプログラムを実行してみると、12!までは正しい値が出力されるのですが、13!の値が1932053504と出力され、計算機の値と違います。 どこが間違っているのでしょうか。どなたかご教授お願いします。

  • 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;   ここから先が分かりません。

  • c言語 行列のn階乗のプログラム

      1 2 -1 D= 3 0 -2   -1 1 2 の3次正方行列のn乗を計算するプログラムを作成しています。 いろいろと試してみましたがうまくいきません。 どなたか教えていただけるとうれしいです。 よろしくおねがいします。 #include <stdio.h> int main(void) { int a[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} }; int b[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} }; int s[3][3]; int m,n; int i,j,k; printf("[A]^n;n = ");scanf("%d",&n); for (m=2;m <= n;m++){ for (i=0;i<3;i++){ for (j=0;j<3;j++){ s[i][j] = 0; for(k=0;k<3;k++){ s[i][j] =s[i][j] + a[i][k] * b[k][j]; } } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ b[i][j]=s[i][j]; } } printf("%3d",s[i][j]); putchar('\n'); } return (0); }

  • 階乗のプログラム!!

    階乗を求めるプログラムを作りたいのですが、どうも上手くいきません・・・。下のプログラムを作ってみたのですが、エラーになってしまいます。どなたか教えてください、お願いします!! #include <stdio.h> void main(void) { int i,j; long a=1; for (i=1; i<=10; i++){ for(j=1 ;j <=i; j++){ a=a*j; } printf("%3d %ld \n",i,a); } }

  • 高2の数学で数列がわかりません

    数学の問題です。 数列2/3,2/5.4/5,2/7,4/7,6/7,2/9,4/9,6/9,8/9,2/11・・・・・において (1)4/15はこの数列の第何項か。 (2)この数列の第100項の数は何か。 a1=4,an+1=3an+2^3(n=1,2,3,・・・・)で定めらた数列 {an}の一般項を求めよ。 次の数列の和を求めよ。 (1)1・n+2・(n-1)+3・(n-2)+・・・・・+n・1 (2)7+77+777+7777+・・・・・・+777・・・77 777+77はn個とする 次の和を求めよ。 (1)n Σ1/(2k-1)(2k+1) k=1 (2)n Σ1/k(k+1)(k+2) k=1 a1=5,an+1=2an-3n+4(n-1,2,3,・・・・・・)で定められた数列{an}の一般項を求めよ。 a1=1,a2=1,an+2-an+1-2an=0(n=1,2,3,・・・・・)で定められた数列{an}の一般項を求めよ。 数列{an}の初項から第n項までの和Snが3Sn=4an-3N-1(n=1,2,3,・・・・・)を満たすとき (1)初項a1を求めよ。 (2)一般項anおよび和Snを求めよ。 数列11,1001,100001,10000001,・・・・・について (1)この数列の一般項anを求めよ。 (2)この数列の項はすべて11の倍数であることを証明せよ。 宿題ですが数列が全くわかりません。どうかお願いいたします。

  • C言語で正の整数n を受け取って、この数列の第1 項から第n 項までの

    C言語で正の整数n を受け取って、この数列の第1 項から第n 項までのフィボナッチ数列を求めて表示、および結果をファイルに保存するプログラムを作ってみました。 ですが、答えがおかしくなります(具体的にはーがつくものが交互にでてきます)・・・コンパイルはできたのですが・・・ 環境はvisual c++2010expressです。 また、a[ ]の配列をもっと増やす方法はないでしょうか・・・大きな値を指定してやると、プログラムを実行したら「このプログラムは停止しました~」という画面が出てきます・・・ また、ファイルを保存するときにfprintfで保存しようと思うのですがa+だとうまく保存されるのですがw+だと最後から一つ前のものしか書き込まれません・・・なぜなのでしょうか・・ どなたか教えていただけないでしょうかm( )m ソースはこちらです #include<stdio.h> int main(void){ int i; int n; int a[9999]; printf("n? "); scanf("%d",&n); while(n<0){ printf("nは0より大きい整数でお願いします\n"); printf("n? "); scanf("%d",&n); } for(i=1;i<=n;i++){ if( i == 1 || i == 2 ){ a[i]=1; } else{ a[i]=a[i-1]+a[i-2]; } } for(i=1;i<=n;i++){ printf("a[%d] = %d\n",i,a[i]); } for (i=1;i<n;i++) { FILE *file; file = fopen("k04a.txt","w+"); fprintf(file,"a[%d] = %d\n",i,a[i]); fclose(file); } return 0; }

  • C言語で分からない点があるのですが……

    C言語で分からない点があるのですが…… こんにちは。C言語を学んでいて、詰まったので宜しければ回答いただけると嬉しいです。 フィボナッチ数列に関するプログラミングです。 ユーザから数字を受け取ります。(第何項か) そこまでの数字を表示するというプログラムです。 n=3なら F1=1 F2=1 F3=2 という具合です。 しかし、実行した結果が添付した図の通りで、途中の項がすっ飛ばされていました。 どうすればいいんでしたっけ? 宜しければご助力ください!! #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT number.: "); scanf("%d",&n); for(i=2; i<=n; i++){ printf("F%d = %d\n",n, fib(n)); } }

専門家に質問してみよう