Помощь - Поиск - Пользователи - Календарь
Полная версия: Нахождение числа ПИ
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Орхидея
Мальчики пожалуста помогите, оч трудно паскаль даётся, а учитель дал задание написать программу вычисления 100 верных знаков числа Пи. Как я ни старалась а у меня больше 14 знаков не выходит sad.gif.
У кого есть немножечко времени уделите пожалуста.
Спасибочки заранее.
volvo
Ошиблась разделом? Перенести в простые "Задачи", или ты именно на заказ? Тогда - какие сроки и сумма... smile.gif
volvo
В принципе, задача решена (работает до 54000 знаков после запятой, так что если нужно решение, и ты действительно не ошиблась разделом - пиши в приват, программа будет тебе выслана в течении 5 минут...)
volvo
Тема перенесена в "Задачи"... Вот решение:
type
PArrInt = ^ArrInt;
ArrInt = Array[0 .. Pred(maxInt Div SizeOf(LongInt))] Of LongInt;

Function PiTest(szPi: PChar; Const nDigits: Integer): Boolean;
Var
i, c, f: LongInt;
d, e, b, g, r: LongInt;
a: PArrInt;
szCurDigit: Integer;

_s: String;
Begin
PiTest := False;

If nDigits > 54900 Then Begin
WriteLn('Error in PiTest(): n must be <= 54900'); Exit
End;

szCurDigit := 0;
d := 0;
c := (nDigits div 4 + 1) * 14;
GetMem(a, c * SizeOf(LongInt));
f := 10000;

For i := 0 To Pred( c ) Do
a^[ i ] := 20000000;

Dec(c, 14); b := c;
While b > 0 Do Begin

e := d mod f; d := e;
Dec(b);
While b > 0 Do Begin
d := d * b + a^[ b ];
g := (b shl 1) - 1;
a^[ b ] := (d mod g) * f;
d := d div g;
Dec(b)
End;

r := e + d div f;

If r < 1000 Then Begin

If r > 99 Then Begin
szPi[szCurDigit] := '0'; Inc(szCurDigit);
End
Else
If r > 9 Then Begin
szPi[szCurDigit] := '0'; Inc(szCurDigit);
szPi[szCurDigit] := '0'; Inc(szCurDigit);
End
Else Begin
szPi[szCurDigit] := '0'; Inc(szCurDigit);
szPi[szCurDigit] := '0'; Inc(szCurDigit);
szPi[szCurDigit] := '0'; Inc(szCurDigit);
End;
End;

Str(r, _s);
Move(_s[1], szPi[szCurDigit], Length(_s));
Inc(szCurDigit, Length(_s));

Dec(c, 14); b := c;
End;

FreeMem(a, c * SizeOf(LongInt));
szPi[szCurDigit] := #0;

PiTest := True
End;

Const
nDigits = 100;

var
szPi: PChar;
Begin
GetMem(szPi, nDigits+1);
WriteLn('PI Computation');
PiTest(szPi, nDigits);
WriteLn('The ', nDigits, ' of Pi are: '#13#10, szPi);
FreeMem(szPi, nDigits+1);
End.


Проверить выдаваемые программой значения можешь здесь:
Пи-Club или Клуб фанатиков числа Пи
=guns=
2 volvo
Нет ли ссылки с описанием этого алгоритма пошагово. Нам тоже задали эту задачу, но надо не только представить программу, но описать как она работает.
volvo
Нет, во всяком случае у меня...

Эта процедура была выдрана мной из одного из BenchMark-ов несколько месяцев назад.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.