【发布时间】:2015-05-31 15:30:42
【问题描述】:
我试图在不使用Math.Pi 的情况下计算 Pi 的第 n 位数字,它可以指定为参数。
我修改了一个现有的算法,因为我喜欢在不使用字符串转换或默认类的情况下找到第 N 个数字。
这是我的算法目前的样子:
static int CalculatePi(int pos)
{
List<int> result = new List<int>();
int digits = 102;
int[] x = new int[digits * 3 + 2];
int[] r = new int[digits * 3 + 2];
for (int j = 0; j < x.Length; j++)
x[j] = 20;
for (int i = 0; i < digits; i++)
{
int carry = 0;
for (int j = 0; j < x.Length; j++)
{
int num = (int)(x.Length - j - 1);
int dem = num * 2 + 1;
x[j] += carry;
int q = x[j] / dem;
r[j] = x[j] % dem;
carry = q * num;
}
if (i < digits - 1)
result.Add((int)(x[x.Length - 1] / 10));
r[x.Length - 1] = x[x.Length - 1] % 10; ;
for (int j = 0; j < x.Length; j++)
x[j] = r[j] * 10;
}
return result[pos];
}
到目前为止,它一直工作到第 32 位,然后出现错误。 当我尝试像这样打印数字时:
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("{0} digit of Pi is : {1}", i, CalculatePi(i));
}
Console.ReadKey();
}
第 32 位和第 85 位以及其他一些数字我得到 10,这显然是不正确的。
27 的原始数字如下所示:
...3279502884.....
但我明白了
...32794102884....
算法有什么问题,我该如何解决这个问题? 算法还可以调整以提高速度吗?
【问题讨论】:
-
嗯,用调试器和原程序对比一下,你觉得我们应该给你调试一下?
-
速度的提升在于不循环调用计算,因为你一遍又一遍地重新计算数字列表,只是为了提取不同的数字。返回列表而不是单个值。
-
@MOehm:感谢您的想法。但是您是否也对错误的“10”位有所了解?我该如何纠正算法中的这个错误?