Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2011, 10:22   #1
salwator
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 31
По умолчанию факториал

Помогите пож-та написать программу нахождение факториала.
от 1 до 12 я написал,а вот чтобы ещё от 13 и выше находило,не могу написать.
salwator вне форума Ответить с цитированием
Старый 03.06.2011, 10:55   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Так и должно быть.
Выбранному Вами типу данных банально не хватает разрядности...

Решение.
либо (с сильной потерей точности) использовать вещественный тип данных (Double, Extended и т.п.) (кстати, тоже не очень большой факториал можно посчитать... ну что-то в районе 70-80)

Либо, если нужно больше, то только длинная арифметика поможет (поиск по форуму рулит!)

кстати, чтобы представить, что такое факториал,
попытайтесь прочитать вслух (ну там миллиарды, триллионы и т.п.) факториал 30
(30! = 265252859812191058636308480000000)

p.s. расcчитано с помощью Вычисление факториала числа Online

Последний раз редактировалось Serge_Bliznykov; 03.06.2011 в 11:00.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.06.2011, 21:01   #3
salwator
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 31
По умолчанию

мне желательно бы сам код посмотреть
salwator вне форума Ответить с цитированием
Старый 03.06.2011, 22:37   #4
Repy
 
Регистрация: 03.06.2011
Сообщений: 6
По умолчанию

Код такойже как и уже есть
for i:=1 to n do
sum:=sum*i;
просто пропиши sum: extended; в варе
Repy вне форума Ответить с цитированием
Старый 04.06.2011, 02:14   #5
salwator
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 31
По умолчанию

непомогает
выводит 116 ошибку
salwator вне форума Ответить с цитированием
Старый 04.06.2011, 13:30   #6
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Цитата:
Сообщение от salwator Посмотреть сообщение
непомогает
выводит 116 ошибку
В настройках компилятора включи поддержку математического сопроцессора, либо в самое начало допиши соответствующую директиву
Код:
{$N+}
Можно поизвращаться и поумножать в столбик
Код:
const
     n=160;
type
     LongLong = array[0..n-1] of byte;
procedure input_(k: integer; var x: LongLong);
var
    s: string;
    q: integer;
begin
    q:=0;
    while k<>0 do begin
        x[n-1-q]:=k mod 10;
        k:=k div 10;
        inc(q)
    end;
    for k:=n-1-q downto 0 do x[k]:=0
end;
procedure output_(x: LongLong);
var
    b: boolean;
    i: integer;
begin
    b:=false;
    for i:=0 to n-1 do if x[i]<>0 then b:=true;
    if b then begin
        for i:=0 to n-1 do write(x[i]);
        writeln
    end
end;
procedure Inc10(var x: LongLong);
var
    i: integer;
begin
    for i:=1 to n-1 do x[i-1]:=x[i];
    x[n-1]:=0;
end;
procedure summa(x, y: LongLong; var z: LongLong);
var
    i, k: integer;
begin
    for k:=0 to n-1 do z[k]:=0;
    for i:=n-1 downto 0 do begin
        k:=x[i]+y[i]+z[i];
        z[i-1]:=k div 10;
        z[i]:=k mod 10;
    end;
end;
procedure proizv(x, y: LongLong; var xy: LongLong);
var
    tmp, z: LongLong;
    i, j, k: integer;
begin
    for k:=0 to n-1 do xy[k]:=0;
    for i:=n-1 downto 0 do begin
        for k:=0 to n-1 do z[k]:=0;
        for j:=n-1 downto 0 do begin
            k:=x[i]*y[j]+z[j];
            z[j-1]:=k div 10;
            z[j]:=k mod 10;
        end;
        for j:=i to n-1-1 do Inc10(z);
        for j:=0 to n-1 do tmp[j]:=xy[j];
        summa(tmp, z, xy);
    end
end;

var
  a, b, c: LongLong;
  i, j: integer;
begin
  input_(1, a);
  for i:=1 to 100 do begin
      input_(i, b);
      proizv(a, b, c);
      for j:=0 to n-1 do a[j]:=c[j];
      write(i:3,' ! = ');
      output_(a)
  end;
  readln
end.
Выдаёт факториал до 100 (можно и больше) .
Цитата:
100 ! = 93326215443944152681699238856266700 49071596826438162146859296389521759 99932299156089414639761565182862536 97920827223758251185210916864000000 000000000000000000
P.S. Оптимизации никакой
eoln вне форума Ответить с цитированием
Старый 04.06.2011, 15:18   #7
salwator
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 31
По умолчанию

спасибо!!!!
salwator вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Факториал ArchiBishop Помощь студентам 0 26.01.2011 23:20
Факториал Dracula777 Помощь студентам 4 26.02.2010 22:56
C++ (факториал) slim>>> Помощь студентам 2 13.01.2010 20:34
Факториал. dimka660i Помощь студентам 11 10.10.2009 23:28