大きな値の階乗について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
女郎花

大きな値の階乗について

#1

投稿記事 by 女郎花 » 17年前

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:大きな値の階乗について

#2

投稿記事 by box » 17年前

> 5行目のint i;がまずいのでしょうか?

そこはたぶんint型のままでよいと思います。
結果が概算でよければ、kaijo関数の型をdouble型にしてください。

一の位まで正確に求める必要があれば、
何桁かごとに分割してint型の配列に格納する、
というような特別な方法を使う必要があります。

ソースを貼り付ける際、インデントは全角空白ではなく
半角空白かタブコードを使ってください。
そして、ソースの前後を

<pre>
ソース本体
</pre>

のようにタグ(不等号は半角を使います)ではさんでください。

管理人

Re:大きな値の階乗について

#3

投稿記事 by 管理人 » 17年前

極端に大きな桁を扱う時は、longlong型っていう型もあるので、そういうのも参考にしてみてください。

女郎花

Re:大きな値の階乗について

#4

投稿記事 by 女郎花 » 17年前

boxさん、管理人さん、ありがとうございます。

自分がやろうとしているのは一の位まで求めるため配列を用いる
やり方のようなのですが、もしよろしければどのようになるのか
教えてもらってもよろしいでしょうか?

ソースを貼り付ける際は気をつけます、すみませんでした。

box

Re:大きな値の階乗について

#5

投稿記事 by box » 17年前

ヒントになればよいのですが…。

配列の各要素に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!)。

女郎花

Re:大きな値の階乗について

#6

投稿記事 by 女郎花 » 17年前

boxさん、ありがとうございます!
頑張ってやってみます。

管理人

Re:大きな値の階乗について

#7

投稿記事 by 管理人 » 17年前

そうやって大きな数が計算できるんですね~。
参考になりました。

中学生の先生が「人間知識より知恵が大事」といつも言ってた意味が実感できます^^;

閉鎖

“C言語何でも質問掲示板” へ戻る