1

我正在制作一个程序,该程序通过将具有给定半径的多边形的边数增加到一个极高的数量,获取面积并将其除以半径的平方来估计 pi。我有以下内容:

            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使用 a或数组 with来累积字符串String.Join

你不应该使用 adouble作为迭代变量;使用 anint代替(这不是一个效率问题,而是一个潜在的陷阱)。

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 回答