アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;

  ここから先が分かりません。

A 回答 (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;
 }
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/09 19:00

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とします。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!