Я пытаюсь вычислить n-ю цифру числа Пи без использования Math.Pi
, которое можно указать в качестве параметра. Я изменил существующий алгоритм, так как мне нравится находить 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();
}
Это я получаю 10 для 32-й цифры и 85-й цифры, а также некоторых других, что явно неверно.
Исходные цифры из числа 27 выглядят так:
...3279502884.....
но я получаю
...32794102884....
Что не так с алгоритмом, как я могу решить эту проблему? И можно ли еще подправить алгоритм для повышения скорости?