1

与えられた半径の多角形の辺の数を非常に多くし、面積を取り、それを半径の2乗で割ることによって、円周率を推定するプログラムを作成しています。私は次のものを持っています:

            double radius = 5;

            for (double sides = 3;sides < 10000;sides++)
            {
                double pi_est = ((radius * radius * sides * Math.Sin((360 / sides)*(Math.PI/180))) / 2) / (radius * radius);
                richTextBox1.AppendText(pi_est+"\n");
            }

現在のところ、これは完了するのに約5秒かかります。ループの効率を改善するために書き直すことができるものはありますか?

4

2 に答える 2

8

このAppendText呼び出しは、UIにアクセスすることを意味するため、多くの時間がかかります。StringBuilder代わりに、または配列を使用して文字列を累積しますString.Join

double反復変数としてを使用しないでください。代わりに使用してintください(これは効率の問題ではなく、潜在的な落とし穴です)。

radius*radiusキャンセルします-pi使用される半径とは無関係であることに注意してください。したがって、半径が1に等しいと仮定して、それを無視することができます。

すべて書き出された:

StringBuilder sb = new StringBuilder();

for(int sides = 3; sides < 10000; sides++) {
    double pi_est = sides * Math.Sin((2*Math.PI)/sides) / 2;
    sb.append(pi_est + "\n");
}
richTextBox1.AppendText(sb.ToString());
于 2012-09-19T01:40:40.393 に答える
5

手始めに、半径*ループの外側の半径を事前に計算できます。

また、ループ内で不要な場合は、ループ外でリッチテキストボックスを更新し、内部でStringBuilderを使用するだけです。

于 2012-09-19T01:38:00.507 に答える