Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Помогите, пожалуйста, с программой. Паскаль (http://www.tehnari.ru/f41/t72810/)

Juliet 09.05.2012 08:18

Помогите, пожалуйста, с программой. Паскаль
 
Разработка программы «Вычисление точного значения суммы дробей»
Составить программу для вычисления точного значения суммы дробей 1/1!+1/2!+1/3!+...+1/n! при n>10. Ответ должен быть представлен в виде несократимой дроби p/q, где р,q – натуральные числа.

Буду очень признательна)))

Vladimir_S 09.05.2012 10:21

Цитата:

Сообщение от Juliet (Сообщение 729792)
Разработка программы «Вычисление точного значения суммы дробей»
Составить программу для вычисления точного значения суммы дробей 1/1!+1/2!+1/3!+...+1/n! при n>10. Ответ должен быть представлен в виде несократимой дроби p/q, где р,q – натуральные числа.

Буду очень признательна)))

Ну что же - пожалуйста. Только вот... Вы знаете, я в некотором недоумении. Вы АБСОЛЮТНО уверены, что не перепутали знак неравенства в условии "n>10"? Поясню. По условию задачи тут приходится работать с целыми числами. Но в большинстве реализаций Паскаля целочисленный формат не идет дальше четырехбайтового (тип LongInt в Turbo или Integer в АВС), а это всего-то до 2147483647, отсюда максимальное значение N составляет 12. Мой Free Pascal понимает восьмибайтовый формат QWord, тут несколько полегче: предел 18446744073709551615 и максимальное значение N уже 20. Его я и применил в программе. Если же, как я подозреваю, с условием Вы (или составители методички, что в порядке вещей) напутали, и Ваш Паскаль не понимает формата QWord, то замените в программе (в трех местах) этот QWord на LongInt (для Turbo) или Integer (для АВС).
Код:

Var
 N,i:Byte;
 p,q,m:QWord;

function Nfact(r:Byte):QWord;
VAR
  j:Byte;
  fact:QWord;
BEGIN
  IF r=0 THEN fact:=1 ELSE
    BEGIN
      fact:=1;
      FOR j:=1 TO r DO
        fact:=fact*j;
    END;
  Nfact:=fact;
END;


Begin
 Repeat
  Write('N= (0 to quit): ');
  Readln(N);
  If N>0 then
  begin
    q:=Nfact(N);
    p:=0;
    For i:=1 to N do
    p:=p+(q div Nfact(i));
    For i:=2 to N do
    If ((p mod i)=0) and ((q mod i)=0) then
      begin
      p:=p div i;
      q:=q div i;
      end;
    Writeln('p = ',p);
    Writeln('q = ',q);
    Writeln('Testing:');
    Writeln('p/q = ',1.0*p/q:8:6,'    e-1 = ',Exp(1)-1:8:6);
  end;
 Until N=0;
End.


Juliet 09.05.2012 11:12

Если бы было "<10", то я и сама бы справилась без труда...) а тут именно знак ">"

Vladimir_S 09.05.2012 12:25

Цитата:

Сообщение от Juliet (Сообщение 729842)
Если бы было "<10", то я и сама бы справилась без труда...) а тут именно знак ">"

Ну так что - подходит решение с QWord или надо без него изворачиваться?

Juliet 09.05.2012 13:00

Цитата:

Сообщение от Vladimir_S (Сообщение 729887)
Ну так что - подходит решение с QWord или надо без него изворачиваться?

Думаю да, спасибо огромное)))

Vladimir_S 09.05.2012 13:22

Цитата:

Сообщение от Juliet (Сообщение 729900)
Думаю да, спасибо огромное)))

Ну дай-то Бог, потому что иначе придется переходить к строкам, сдвигам - в общем, жуть беспросветная...


Часовой пояс GMT +4, время: 17:55.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.