• ベストアンサー

小数点第200位近くまでの商を出すことのできるプログラム

c言語で,小数点第200位近くまでの商を出すことのできるプログラムをつくりたいのですが,原理は思い付いてもそれをどう記述すればよいかわからずこまっています。 思い付いたのは,配列kを用意し,一つのk[n]には0から9までの数字がはいるようにする。たとえば, 1.666666…を3で割るとすれば, k[0]=1,k[1]=6,k[2]=6,… として 1を3で割った商を新しいk[0]になるようにして,あまりを10倍したものとk[1]の和をまた3でわって商をあたらしいk[1]に…とこれを繰り返すようなプログラムをつくりたいです。当然FOR文を使うのはわかっているのですが。。。 うまく説明できなくてすいません。 最終的にはe=1 + 1/1! + 1/2! + 1/3! + .... + 1/n! + .... を求めるプログラムをつくるつもりなのですが,その過程で 1/2! のつぎは1/2! を3でわって 1/3!を出す。という方法をとろうとおもっています。 そのときに最初でいった割り算計算がどうしても必要だとおもうんです だれかわかりやすく教えてくださると幸です。

質問者が選んだベストアンサー

  • ベストアンサー
  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.3

整数配列に入った数値の商を元の配列に入れる関数を作ってみました。 void array_div(int *a, int b, int max) {  int i, x;  for(i=0; i<max; i++) {   if(i < max -1)    a[i+1] += (a[i] % b) * 10;   a[i] /= b;  } } 基本的には#1の方と同じですが、 ・余りの処理を先に行わないと現在の桁の値が変わるのを修正 ・余りと次の桁との加算は最終桁の1つ手前までに修正 しました。

rousei
質問者

お礼

できましたできました! ありがとうございます!

その他の回答 (3)

  • kary
  • ベストアンサー率55% (10/18)
回答No.4

以下の書籍の「eの1000桁計算」のアルゴリズムが参考になるのではないかと思います。

参考URL:
http://www.gihyo.co.jp/books/syoseki.php/4-7741-1239-9
rousei
質問者

お礼

ありがとうございました、今度本屋で立ち読みしてみます!

  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.2

質問文にあるような方法ではメモリも余分にかかりますし、速度的も不利になるので、できれば2進数のまま変数一杯まで使うようしたほうがいいと思うのですが。 気にしなければいい、と言われればそれまでですけど。 この手のライブラリ(多倍長演算)は結構インターネットなどでも流れていますよ。 このサイトでも何度かでてきているようですし。 有名どころはGNU MPとNTLですね。 http://www.swox.com/gmp/ http://www.shoup.net/ntl/ GNU MPならmpf_t、NTLならRRを使えばできそうです。 http://www.swox.com/gmp/manual/Floating-point-Functions.html#Floating-point%20Functions http://www.shoup.net/ntl/doc/tour-struct.html 両者ともコンパイルが必要なので、環境によってはうまくインストールできないかもしれません。 少し変更すれば、ほとんどの環境で可能なはずですけど。 http://nhiro4.infoseek.livedoor.com/gmp/index.html ちなみに四則演算のなかでは除算が一番面倒くさいです。

参考URL:
http://nhiro4.infoseek.livedoor.com/gmp/index.html
rousei
質問者

お礼

英語のページでちょっとわかりづらかったです^^; でもありがとうございました

  • itope
  • ベストアンサー率18% (3/16)
回答No.1

解答になるかわからないのですが まず、1.666…みたいなのを配列に入れるのならば k[0]=1 k[1]=6 という形ならば、つまりは double atai; //この値が、1.666…が入っているとこ for(n=0;n<=MAX;n++){   k[n] = atai % 10;   atai = atai * 10; } で、割り算は int m; //割る値 for(n=0;n<=MAX;n++){   k[n] = k[n] / m;   k[n+1] = k[n+1] + (k[n] % m) * 10; } って感じでしょうか ちなみに、e=1 + 1/1! + 1/2! + 1/3! + .... + 1/n! + .... を通分するっていうのは、なしですか?

rousei
質問者

お礼

一応通分はなしの方向で^^; でもご解説通りにやるとできました! ありがとうございました

関連するQ&A