• ベストアンサー

eを小数第200位くらいまで求めたい。

前回の質問での解説を踏まえて、自分なりにcでプログラム作ってみました。 ――――――――――――――――― #include <stdio.h> #define size 250 void main() { int i, b, k[size], e[size]; k[0]=1; e[0]=1; for(i=1; i<size; i++){ k[i]=0; e[i]=0; } for(b=1; b<size; b++){ for(i=0; i<size; i++){ if(i<size-1) k[i+1] += (k[i] % b) * 10; k[i] /= b; if(e[i]+k[i]>=10){ e[i] = e[i]+k[i]- 10; e[i-1] += 1; } else e[i] += k[i]; } } for(i=0; i<size; i++) printf("%d",e[i]); } ―――――――――――――― ここで表示される値に小数点はつきませんが、それは気にしないでいいです。 この記述でなんか無駄なところはあるでしょうか もっとキレイにかけそうな気がするのですが。。 とくに、1/b!の値をk[]に入れ、それをe[]に順に足していき、ある小数点第x位での和、e[x]とk[x]でその和が10を超える場合、小数点x-1位にくりあがる(つまりk[x-1]に1を足す)という記述をもっと簡単にelseを使わずにできないでしょうか?? e[i-1] += 1; というところも、iの初期値は0なので、下手すると値によってはe[-1]となってしまう可能性があるような気がします、今回はならないみたいですけれども。 なにかもっと簡単にできるところや、訂正すべき箇所があればご指摘ください よろしくおねがいします ちなみに前回の質問はこれです http://oshiete1.goo.ne.jp/kotaeru.php3?q=535756

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

  • ベストアンサー
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.1

個人的な好みに合わせて書き換えてみました。多少の参考にはなるかもしれません。 ●配列kとeの最初と最後の要素は無視 ●bの最大値を配列サイズとは別に定義 ●その他いろいろ -------------------------------------------------- #include <stdio.h> #define SIZE 252 #define B_MAX 100 int main() {   int i, b, k[SIZE] = {0, 1}, e[SIZE] = {0, 1};   for(b=1; b < B_MAX; b++){     for(i = 1; i < (SIZE - 1); i++){              // k/bの計算       k[i + 1] += (k[i] % b) * 10;       k[i] /= b;              // e+kの計算       e[i] += k[i];       e[i - 1] += e[i] / 10;       e[i] %= 10;     }   }   for(i = 1; i < (SIZE - 1); i++) {     printf("%d", e[i]);   }      return 0; }

その他の回答 (1)

回答No.2

ひどく冗長になっていますが、以下のプログラムが 同一アルゴリズムでは、早いほうだと思います。 改良点は、以下の通り 1)配列Kが既に0になっている部分は計算しない。 2)答えの繰り上がりは、まとめて最後に行う。 2)については、今回の計算の一桁が4バイトINT以内に収まるために出来ることです。 #include <stdio.h> #define size 250 void main() { int i, b, start,amari,k[size], e[size]; start=-1; k[0]=1; e[0]=1; for(i=1; i<size; i++){ k[i]=0; e[i]=0; } for(b=1; b<size; b++){ amari=0; for(i=start+1; i<size; i++){ k[i]+=amari*10; amari=k[i] % b; k[i] /= b; if(k[i]==0){ start=i; } else{ e[i] += k[i]; break; } } if(start+1==size){ printf("%d\n",b); break; } i++; for(; i<size; i++){ k[i]+=amari*10; amari=k[i] % b; k[i] /= b; e[i] += k[i]; } } for(i=size-1;i>0;i--){ e[i-1]+=e[i] / 10; e[i]= e[i] % 10; } for(i=0; i<size; i++) printf("%d",e[i]); }

関連するQ&A