Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нахождение числа е (2,7...), Pascal , описание алгоритма и программа 
:(
    Опции темы
Гость_Александра
Дата 13.1.2006, 01:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











помогите решить задание:
Дано натуральное число n, в интервале от 1 до 100. Необходимо вычислить n первых знаков числа е (2,7...). Готовых функций использовать нельзя.
Надо написать алгоритм решения задачи и программу.
Вычислить число е с точностью еще могу, используя рекурсию для поиска факториала.но этого мало надо вывести определенное количество знаков числа е. Помогите пожалуйста. Программу надо написать в Pascal
var n: integer;
prec,e,ss:real;
function f(n:integer):integer;
begin
if(n=1) then f:=1
else f:=f(n-1)*n
end;
begin
prec:=0.000001;
e:=1;

n:=1;

while (1/f(n))>prec do
begin

e:=e+1/f(n);
n:=n+1;
end;

  Вверх
MAKCim
Дата 13.1.2006, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 6
Всего: 207



зачем каждый раз считать факториал, ведь f(n+1)=f(n)*(1/(n+1))


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Гость_Александра
Дата 13.1.2006, 13:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Может я не понимаю, но ведь это тоже вычисление факториала, вернее 1/n!. Ну ладно , а как мне все-таки вывести на экран только заданное значение знаков е?
  Вверх
Mal Hack
Дата 13.1.2006, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 4
Всего: 261



Стоп. Ряд, который образуется 1/n! никогда не будет больше 1. E образует ряд вида x^n/n!
Добавлено @ 14:05
Алгоритм такой.
a = 1;
b = 1;
s = 0;
while( r > prec )
{
r = a/b;
s = s + r;
Inc(i);
a = x^i;
b = b * i;
}
PM ICQ   Вверх
AleksandraL
Дата 13.1.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.1.2006

Репутация: нет
Всего: нет



Вот обнаружила такую программу , но к сожалению не понимаю. Может кто объяснит?!
Следующая программа вычисляет NbDigits=10000 первых цифр числа е.
/*
** Pascal Sebah : July 1999
**
** Subject:
**
** A very easy program to compute e with many digits.
** No optimisations, no tricks, just a basic program to learn how
** to compute in multiprecision.
**
** Formula:
**
** e = 1+1/1!+1/2!+...+1/k!+...
**
** Data:
**
** A big real (or multiprecision real) is defined in base B as:
** X = x(0) + x(1)/B^1 + ... + x(n-1)/B^(n-1)
** where 0<=x(i)<B
**
** Results: (PentiumII, 450Mhz)
**
** 1000 decimals : 0.02seconds
** 10000 decimals : 1.2s
** 100000 decimals : 97.0s
** 200000 decimals : 375.0s
**
** With a little work it's possible to reduce those computation
** times by a factor of 3 and more.
*/
#include <stdio.h>
#include <stdlib.h>
long B=10000; /* Working base */
long LB=4; /* Log10(base) */
/*
** Set the big real x to the small integer Integer
*/
void SetToInteger (long n, long *x, long Integer) {
long i;
for (i=1; i<n; i++) x[i] = 0;
x[0] = Integer;
}
/*
** Is the big real x equal to zero \?
*/
long IsZero (long n, long *x) {
long i;
for (i=0; i<n; i++)
if (x[i]) return 0;
return 1;
}
/*
** Addition of big reals : x += y
** Like school addition with carry management
*/
void Add (long n, long *x, long *y) {
long carry=0, i;
for (i=n-1; i>=0; i--) {
x[i] += y[i]+carry;
if (x[i]<B) carry = 0;
else {
carry = 1;
x[i] -= B;
}
}
}
/*
** Division of the big real x by the integer d
** Like school division with carry management
*/
void Div (long n, long *x, long d) {
long carry=0, xi, q, i;
for (i=0; i<n; i++) {
xi = x[i]+carry*B;
q = xi/d;
carry = xi-q*d;
x[i] = q;
}
}
/*
** Print the big real x
*/
void Print (long n, long *x) {
long i;
printf ("%d.", x[0]);
for (i=1; i<n; i++) {
printf ("%.4d", x[i]);
if (i%25==0) printf ("%8d\n", i*4);
}
printf ("\n");
}
/*
** Computation of the constant e
*/
void main () {
long NbDigits=10000, size=1+NbDigits/LB;
long *e = (long *)malloc(size*sizeof(long));
long *uk = (long *)malloc(size*sizeof(long));
long k=1;

// Formula used : e = 1+1/1!+1/2!+...+1/k!+...
SetToInteger (size, e, 1); /* e = 1 */
SetToInteger (size, uk, 1); /* uk = 1 */
while (!IsZero(size, uk)) {
Div (size, uk, k); /* uk = u(k-1)/k */
Add (size, e, uk); /* e = e + uk */
k++;
}
Print (size, e); /* Print out of e */
free (e);
free (uk);
}
Добавлено @ 14:34
Цитата(Mal Hack @ 13.1.2006, 14:01)
Стоп. Ряд, который образуется 1/n! никогда не будет больше 1. E образует ряд вида x^n/n!
Добавлено @ 14:05
Алгоритм такой.
a = 1;
b = 1;
s = 0;
while( r > prec )
{
  r = a/b;
  s = s + r;
  Inc(i);
  a = x^i;
  b = b * i;
}


Увы, теперь совсем запуталась.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.