|
!10000を求めるプログラムを考えてみたのですが、
行き詰まりいろいろ調べた結果以下のソースコードを見つけました。
ちなみにもともとのコードでは
#define MAX 500
程度になっていたので!10000が計算できるよう現在のように変更しました。
このコードを実行すると結果的にはおそらく正確な値が計算されていると思うのですが、
アルゴリズムが私にとっては複雑でなぜこの方法で階乗が計算できるのか
理解できません。(特に18行目〜30行目)
よろしかったらどなたか教えていただけないでしょうか?
#include <stdio.h>
#define RADIX 10
#define MAX 40000
int f[MAX], carry, tmp;
int n = -1, keta, i, j;
int main(void) {
for(i = 0; i < MAX; i++) f[i] = 0;
f[0] = 1;
while(1) {
printf("n = ");
scanf("%d", &n);
if(n >= 0) break;
printf("ERR: n must be zero or positive.");
}
for(j = n; j >= 1; j--) {
for(i = 0; i < MAX; i++) f[i] = f[i] * j;
carry = 0;
for(i = 0; i < MAX; i++) {
tmp = f[i] + carry;
f[i] = tmp % RADIX;
carry = tmp / RADIX;
}
if(carry > 0) {
printf("overflow\n");
return(-1);
}
}
for(i = MAX - 1; i >= 0; i--) {
if(f[i] != 0) {
keta = i + 1;
break;
}
}
for(i = keta - 1, j = 1; i >= 0; i--, j++) {
if((j % 70) == 0) printf("\n");
printf("%d", f[i]);
}
return(0);
}
|