30の階乗を計算するプログラムを作りたいのですが
#include<stdio.h>
int kaijo(int);
int main(void)
{
int i;
i=30;
printf("%d!=%d \n",i,kaijo(i));
return 0;
}
int kaijo(int n)
{
if(n==0)
return 1;
else
return n*kaijo(n-1);
}
として実行したところ
30!=1409286144
となってしまいました
5行目のint i;がまずいのでしょうか?
大きな値の階乗について
-
box
Re:大きな値の階乗について
> 5行目のint i;がまずいのでしょうか?
そこはたぶんint型のままでよいと思います。
結果が概算でよければ、kaijo関数の型をdouble型にしてください。
一の位まで正確に求める必要があれば、
何桁かごとに分割してint型の配列に格納する、
というような特別な方法を使う必要があります。
ソースを貼り付ける際、インデントは全角空白ではなく
半角空白かタブコードを使ってください。
そして、ソースの前後を
<pre>
ソース本体
</pre>
のようにタグ(不等号は半角を使います)ではさんでください。
そこはたぶんint型のままでよいと思います。
結果が概算でよければ、kaijo関数の型をdouble型にしてください。
一の位まで正確に求める必要があれば、
何桁かごとに分割してint型の配列に格納する、
というような特別な方法を使う必要があります。
ソースを貼り付ける際、インデントは全角空白ではなく
半角空白かタブコードを使ってください。
そして、ソースの前後を
<pre>
ソース本体
</pre>
のようにタグ(不等号は半角を使います)ではさんでください。
-
女郎花
Re:大きな値の階乗について
boxさん、管理人さん、ありがとうございます。
自分がやろうとしているのは一の位まで求めるため配列を用いる
やり方のようなのですが、もしよろしければどのようになるのか
教えてもらってもよろしいでしょうか?
ソースを貼り付ける際は気をつけます、すみませんでした。
自分がやろうとしているのは一の位まで求めるため配列を用いる
やり方のようなのですが、もしよろしければどのようになるのか
教えてもらってもよろしいでしょうか?
ソースを貼り付ける際は気をつけます、すみませんでした。
-
box
Re:大きな値の階乗について
ヒントになればよいのですが…。
配列の各要素に3桁ずつ格納するとします。
array[2] array[1] array[0]
0! = 0 0 1
1! = 0 0 1
2! = 0 0 2
3! = 0 0 6
4! = 0 0 24
5! = 0 0 120
6! = 0 0 720
7! = 0 5 40
8! = 0 40 320
9! = 0 362 880
10! = 3 628 800
11! = 39 916 800
12! = 479 1 600
以下省略
1)0!として、array[0]に1を入れておくことから始めます。
2)次の数の階乗を求めるときの処理は次のとおりです。
・配列の各要素に、その数を掛ける
・各要素に3桁ずつ格納するので、1000で割った余りを自分の要素とし、
1000で割った商を配列の次の要素に加える
答えを出力する際には、やや工夫が必要です(例:上記の7!や12!)。