100の階乗を求めるプログラムの作り方

このQ&Aのポイント
  • 100の階乗を配列を利用してプログラムを組む方法について分かりません。
  • 数値を入力して、1から順番に入力して数値までかけて行きたいです。
  • 繰り上がり(agari)を利用して、人間が筆算をしているのと同じやり方で計算したいです。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • dahho
  • ベストアンサー率44% (68/153)
回答No.2

すみません。さっきのは間違えてました。 for(k=2;k<=a;k++){ //kをsu[]にかける  su[0] *= k;  for(i=1;i<N;i++){   su[i]*=k;   agari=su[i]/10;   su[i]%=10;   for(j=i-1;j>0;j--){    agari+=su[j]    su[j]=agari%10;    agari/=10;    if(agari==0)break;   }   su[0]=agari;  } }

bison2005
質問者

お礼

ありがとうございました。 今日、このレポートをしあげてきました。 ですが、自分が書いていなかったのが悪いのですが、【break】は使っちゃダメな授業だったので、結局自力でやりました。ありがとうございます。

その他の回答 (1)

  • dahho
  • ベストアンサー率44% (68/153)
回答No.1

100以下の任意の階乗を求めたいということですね?配列は1つの変数に0から9までの数値だけを入れて10進N桁で計算しようということですね? for(k=2;k<=a;k++){ //kをsu[]にかける  su[0] *= k;  for(i=1;i<N;i++){   su[i]*=k;   if(su[i]>9){ //繰り上がり    agari=su[i];    for(j=i;j>0;j--){     su[j]=agari%10;     agari/=10;    }    su[0]=agari;   }  } } こんな感じでどうでしょう? ちなみに、intの最大が32767ですので、a<100なら、1つの変数に0から99まで入れて、9→99、10→100としても良いですし、ちょっと面倒でも2進数で考えるともっとメモリが節約できます。 1つの変数で9ビット(100は7ビット、intは16ビットなので16-7=9ビット)使うとして、9→511、10→512とします。

関連する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のプログラムが分からず困っています。 分かる方、お願いいたします

  • 階乗のプログラム!!

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

  • 階乗の出力について

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

  • 階乗

    数列{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言語の根本的なやり方が分かってなくてすいません!!

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

    wikipediaのコムソートを参考に、次のように作りました。 動きますでしょうか。動かなければ、どこをどのようにすればよいか教えていただけませんでしょうか。 プログラム「#include<stdio.h> #include<string.h> void combsort(void); void swap(void); int main(void) { combsort(); swap(); printf("データ%dの並べ替え結果は、\n%d\nです。\n"data2,data); return 0; } void combsort(){ int h,swaps,data,len,data2; printf("ソートさせる数を入力。>\n"); scanf("%d",&data); data2 = data; len = strlen(data); h = len * 10 / 13; while(true){ swapa = 0; for(i = 0;i + h <len;i++) { if(data(i) > data(i + h)) { swap(data, i, i + h); swaps +=1; } } if(h==1){ if(swaps==0){ break; } } else{ h = h * 10 / 13; } } } void swap{ int a,i,j; const int t = a[i]; a[i] = a[j]; a[j] = t; } 」 data:scanfによって入力される並べ替えを行う数値(例:0219523056810)を代入。 data2:dataのコピーで、並べ替えを行う前のデータを保管しておくもの。 また、これの反対(これが、昇順なら、降順。降順なら、昇順。)を同じようにしたいと思います。(combsort2にて)どうすればよいでしょうか。 教えていただけませんでしょうか。 お早めのご回答お待ちしております。

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

  • 階乗をもとめるプログラムで、、

    このように書くと、エラーがでます。 #include<stdio.h> main(){ int number; int kekka; scanf("%d",&number); kekka=KAIJO(number); printf("%d",kekka); } KAIJO(int n;){ int a; a = n * KAIJO(n-1); return(a); } エラー内容は上から数えて8行目に関数kaijoは宣言されていないのでint型 とみなす 上から数えて13行目と14行目あたりに構文上の誤りがある、 といわれます。 Windowsは「C言語を始めよう!」をつかいました。 Linuxでもやったのですが、 これもエラーがでます。どこにエラーがでるのかはわすれました。 再帰関数って何型って宣言しなきゃならないのでしょうか? あとどこがいけないのでしょうか? お願いします。

  • 次のプログラムが作れません…

    キーボードから与えられた整数iに対して、iの階乗(i!)を求める関数"fact"を作成するというものなのですが… メイン関数は次のように与えられています。 #include<stdio.h> int fact(int); int main(void){ int in, i; printf("Input a number:"); scanf("%d",&in); for (i=1; i<=in; i++){ printf(" %d %d\n",i , fact(i) ); } return 0; } よろしくお願いします。

  • 長方形、円、三角形の計算するプログラムでエラーがでます

    タイトルの通りなんですがエラーがでます>< コンパイラはできたのですが、実行して二つ目の入力するとこで、入力したあと止まります。 どこがおかしいのでしょうか? #include <stdio.h> int sikaku(void); int en(void); int main(void) { char ch; int a,b; printf("円(A) 長方形(B) 三角形(C)\n"); printf("入力してください:"); ch = getche(); if(ch == 'C'){ printf("\n底辺を入力してください:"); scanf("%d ",a); printf("高さを入力してください:\n"); scanf("%d",b); printf("%dです",a * b); } else if(ch == 'B') sikaku(); else if(ch == 'A') en(); return 0; } int en(void) { int a; float f; printf("\n半径を入力してください:"); scanf("%d",a); printf("円周率を入力してください:"); scanf("%f",f); printf("%fです",a * a * f); return 0; } int sikaku(void) { int a,b; printf("\n縦を入力してください:"); scanf("%d",a); printf("横を入力してくさい:\n"); scanf("%d",b); printf("dです",a * b); return 0; }

専門家に質問してみよう