• ベストアンサー

階乗のプログラム!!

階乗を求めるプログラムを作りたいのですが、どうも上手くいきません・・・。下のプログラムを作ってみたのですが、エラーになってしまいます。どなたか教えてください、お願いします!! #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); } }

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

  • ベストアンサー
  • akinori_s
  • ベストアンサー率60% (21/35)
回答No.2

これって 1~10までの階乗を出力するってプログラムですよね? 実際に階乗の計算を行ってるのは2つ目のforループで行っていると 思いますが、その前にaを初期化してない為に前に計算した階乗の値が 残ってしまってるからじゃないかと思います。 for (i=1; i<=10; i++){  a = 1; //←初期化  for(j=1 ;j <=i; j++){   a=a*j;  }  printf("%3d %ld \n",i,a); } もしくは... int num = 10; //求める階乗数 int a,i; for(i=1,a=1;i<=num;i++,a=a*i) printf("%3d %ld \n",i,a); こんな感じになると思います。

その他の回答 (2)

noname#30871
noname#30871
回答No.3

 回答は他のかたがなさっているので、アドバイスと称して苦言を一つ。  プログラムが仕様通りの動作をしないとき、「どうも上手くいきません」「エラーになってしまいます」で片付けていたら、永久にプログラミングは上達しませんよ。  プログラムを書いてみたが、思い通りに動かない。それは、プログラミングでは当たり前です。むしろそれからが始まりです。「どうも上手くいきません」とは、具体的にどういう現象が起きるのでしょう。「エラーになってしまいます」とは、どんなエラーメッセージが出るのでしょう。得られる手がかりを駆使してバグの原因を絞り込んでいくのがプログラミングです。  また、エラーメッセージすら示さずに質問をするなんて、他人に対するものの聞き方も覚えてください。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

aの初期化のタイミングがおかしいのではないでしょうか。 各iについて出たaの値をそのまま(i+1)について使っていますから、 このままでは 1! 1!×2! 1!×2!×3!   : 1!×2!×3!×・・・10! を計算することになって、多分オーバーフローを起こします。 外側のforループと内側のforループの間で毎回 a=1 を実行すべきだと思います。

関連するQ&A

  • 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言語の、階乗を使うプログラムの問題を教えて下さい

    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言語 行列の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); }

  • 階乗のプログラム

    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と出力され、計算機の値と違います。 どこが間違っているのでしょうか。どなたかご教授お願いします。

  • ピラミッド表示プログラム。

    ピラミッドを表示させるプログラムを考えています。 例えば3段の場合   *  *** ***** っというような表示です。 #include <stdio.h> void spira(int n); main() { int a; printf("段数は:"); scanf("%d",&a); spira(a); } void spira(int n) { int i,j=1,a,b,k; for(a=n;a>0;a--){ for(b=a-1;b<=n;b--){ printf(" "); } k=(j-1)*2+1; for(i=1;i<=k;i++){ printf("*"); } j++; printf("\n"); } } このように考えてみたのですが、無限ループになって表示できません。 どこが悪いでしょうか? 無限ループの原因はどうやったら解消されるでしょうか?

  • 階乗の出力について

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

  • プログラム

    教えていただきたいのですが、コマンドプロンプトでコンパイラして、実行結果が 2013 2013 hello 2013 hello nagoya 2013 hello nagoya kobe 2013 hello nagoya kobe osaka となるようにプログラミングしているのですが頭が悪く初心者の私にはできません。 下のプログラムだと間違いのようなのでご指摘お願いします。 #include <stdio.h> void main(void) { int i,j; for(j=1;j <= 5;j++) { for(i=1;i<=j;i++) { printf("2013\n"); printf("hello\n"); printf("nagoya\n"); printf("kobe\n"); printf("osaka\n"); } printf("\n"); } }

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • プログラム

    下のようなプログラムを作ったのですが、10進2進変換をj=n>>2&1の部分にあるようなビットシフトではなく、 for(i=1;i<8;i++){printf("bit[%d]=%d\n",i,n%2);n=n/2;}に変えて剰余計算で行うプログラムにしたいのですが、分かる方がいましたら教えて下さい。お願いします。 #include <stdio.h> int main(void) { int i,j,n; i=2; printf("数字を入力="); scanf("%d",&n); printf("Dec=%d\n",n); printf("heX=0x%x\n",n); j=n>>2&1; printf("bit[%d]=%d\n",i,j); return(0); }

  • シェルソートのプログラムが分かりません

    教科書どおり下のようなプログラムを作ったのですが、ちゃんとソートされません。 打ち間違いなどを探しているのですが見つからないんです・・・ それと、プログラム11行目のj=j-hが何のためにあるのか分かりません。もしかしたら幼稚な質問かもしれませんがどうかよろしくお願いします。 #include<stdio.h> void shell(int n,int a[]) { int i,j,x,h; h=n/2; while(h<0) { for(i=h;i<=n;i++) { x=a[i]; for(j=i-h;j>=0;j=j-h) { if(a[j]>x) { a[j]=a[j+h]; a[j+h]=x; } } } h=h/2; } } main() { int a[]={30,20,60,29,10,90}; int n=6; int i; shell(n,a); for(i=0;i<n;i++) { printf("%4d",a[i]); } printf("\n"); }