20の階乗は2432902008176640000ですが、「C言語講座:色々なデータ型の最大値、最小値」によるとintもlongもこの大きさの値を保持できるようにはなっていません。
べつの手段を考えたほうがよいと思います。
追記:
あえてjavascriptで、こんな考え方もあるよ的なサンプルコードを
javascript
1var factorial = function(f){
2 // 下16桁を8桁単位で保持して計算する例
3 var p0 = 1, p1 = 0, p2 = 0;
4 var digit = 100000000
5 for(var i = 2; i <= f; i++){
6 p0 *= i; p1 *= i; p2 *= i;
7 // 下8桁から中8桁に繰り上げ結果反映
8 p1 += (p0 - p0 % digit) / digit;
9 p0 %= digit;
10 // 中8桁から上桁に繰り上げ結果反映
11 p2 += (p1 - p1 % digit) / digit;
12 p1 %= digit;
13 }
14 var result = "" + (p2==0?"":p2) + (p1==0?"":p1) + p0;
15 console.log(result);
16 return result;
17}
18factorial(20);
19// 出力結果:"2432902008176640000"
20
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/21 05:29
2016/04/21 06:21