誕生日にもらった意外なもの

C言語で、入力されたnについてのn!を求めるプログラムを書きました。

#include<stdio.h>

int main()
{
int total=1,i,n;

scanf("%d",&n);

for(i=1;i<=n;i++){
total*=i;
}

printf("%d",total);
}

しかし、このままだとn=13くらいからオーバーフローしてしまって、n=100やn=10000といった大きな数の場合のn!が求められませんよね?
万進法という方法を使って、10000未満の数を配列の要素に割り当てる(説明が正しいかわかりませんが…)と、うまくいくと聞きました。

万進法とはどのようなものでしょうか?やり方を教えてください。
また、C言語での、このプログラムの一例もできれば教えてください。
ですが、今一番知りたいのはどういう手順でプログラムを書けばいいのかということですので、そちらの方を詳しく教えてください。

A 回答 (2件)

こちらにその例が出ています。


参考URLを参照ください。

参考URL:http://detail.chiebukuro.yahoo.co.jp/qa/question …
    • good
    • 0
この回答へのお礼

参考になります。
ありがとうございます。

お礼日時:2011/11/07 23:17

自分で万進法を使った計算を書く方法は#1さんがリンクを貼っているのでそちらでみてください。



自分で書く必然性がない場合はThe GNU Multiple Precision Arithmetic Library (http://gmplib.org/) というライブラリーを使って書くのが普通です。
参考までに、22nekonekoさんがお書きになったプログラムはこう書けます。
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>

int
main(void)
{
mpz_t total;
long int i, n;

mpz_init(total);
mpz_set_si(total, 1);

printf("factorial of :");
scanf("%ld", &n);

for (i = 1; i <= n; i++) {
mpz_mul_si(total, total, i);
}
gmp_printf("factorial(%u) = %Zd\n", n, total);
mpz_clear(total);

return EXIT_SUCCESS;
}

コンパイルは次のようなコマンドで行います。
% gcc factorial.c -lgmp -Lgmpのライブラリがあるディレクトリ -Igmpのヘッダファイルがあるディレクトリ

ちなみに、gmpはRSA暗号の計算などで使われていたりします。
    • good
    • 0
この回答へのお礼

そんな方法もあるんですね。
ありがとうございます。

お礼日時:2011/11/07 23:18

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