Я пытаюсь вычислить n-ю цифру Pi, не используя Math.Pi
, который может быть указан как параметр. Я изменил существующий алгоритм, так как мне нравится находить N-й разряд без использования строковых преобразований или классов по умолчанию. Это как мой алгоритм в настоящее время выглядит следующим образом:Calculate Nth Pi Digit
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 для 32rd цифры и 85rd цифры и некоторые другие, а также, что, очевидно, неверно.
Оригинальные цифры от 27 выглядеть так:
... 3279502884 .....
, но я получаю
... 32794102884. ...
Что не так с алгоритмом, как я могу исправить эту проблему? И может ли алгоритм по-прежнему корректироваться, чтобы улучшить скорость?
хорошо использовать отладчик и сравнить с оригинальной программой, вы думаете, мы должны отладить это для вас? –
Улучшение скорости заключается в том, что вы не вызываете вычисления в цикле, потому что вы повторно вычисляете список цифр снова и снова, просто чтобы извлечь другую цифру. Верните список вместо одного значения. –
@MOehm: Спасибо за идею. Но у вас также есть представление о неправильной цифре «10»? Как я мог исправить эту ошибку в алгоритме? –