0 / 0 / 0
Регистрация: 25.11.2011
Сообщений: 10
1

Вычисление факториала

29.12.2011, 13:25. Показов 16833. Ответов 9
Метки нет (Все метки)

Помогите разобраться! Нужно посчитать факториал 25, а у меня при вводе 21 вылетает ошибка в чем дело не пойму!
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  Math;
 
var P,U:integer;
    X:integer;
    j:cardinal;
    f:extended;
    t1,t2:TDateTime;
 
//--- öèêë for
function FactFor(X: int64):extended;
var r:extended;
    i:integer;
begin
  r:=1;
  P:=1;
  U:=0;
  for i:=2 to x do
  begin
  r:=r*i;
  inc(P);
  inc(U);
  end;
  result:=r;
end;
 
//--- ðåêóðñèÿ
 
  function FactRek(X: byte):extended;
 begin
 if X = 1 then
  FactRek:= 1
 else 
  FactRek:= X*FactRek(X-1);
 end;
 
 
 
//--- ôîðìóëà Äæåéìñà-Ñòèðëèíãà
function FactDS(X: int64):extended;
begin
  Result:=round(SQRT(2*Pi*X)*Power(X/Exp(1),X));
end;
 
//------------ main -------------
 
begin
 
  writeln('Vvedite chislo');
  readln(X);
 
  t1:=Time;
  for j:=1 to 1000000 do
  f:=FactFor(X);
  t2:=Time;
  writeln('Factorial = ',f,', time = ', t2-t1);
  writeln('P = ',P,', U = ',U);
 
  t1:=Time;
  for j:=1 to 1000000 do
  f:=FactRek(X);
  t2:=Time;
  writeln('Factorial = ',f,', time = ', t2-t1);
  
  t1:=Time;
  for j:=1 to 1000000 do
  f:=FactDS(X);
  t2:=Time;
  writeln('Factorial = ',f,', time = ', t2-t1);
 
  readln;
 
end.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2011, 13:25
Ответы с готовыми решениями:

Вычисление факториала
procedure TForm1.Button1Click(Sender: TObject); var x,k,n,p,i,q:integer; s,s1:double; begin...

Вычисление факториала
Доброго всем времени суток. Пишу простенькое приложение для вычисления кол-ва сочетаний с...

Вычисление факториала
как с помощью for написать программу для подсчета n!

Вычисление факториала
как для кнопки сделать так, чтоб она считала факториал числа ( в калькуляторе). мы нажимаем цифру,...

9
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
29.12.2011, 14:51 2
может у тебя проблема в реализации
я через цикл попробовал считает
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.Button1Click(Sender: TObject);
var f,i:integer; res:Extended   ;
begin
f:=strtoint(edit1.Text);
res:=1;
for i:=1 to f do
 res:=res*i;
 
label1.Caption:=floattostr(res);
end;
Добавлено через 2 минуты
хотя попробовал через рекурсию, тоже работает нормально, что за ошибка у тебя и в какой строке?
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,007
Записей в блоге: 3
29.12.2011, 14:56 3
Может дело в этом:
Delphi
1
for i:=2 to x do
i:integer, а x:int64?
0
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
29.12.2011, 15:01 4
Flamepwnz, уточни в какой из функция ошибка
Delphi
1
function FactRek(X: byte):extended;
или
Delphi
1
function FactDS(X: int64):extended;
если
Delphi
1
function FactDS(X: int64):extended;
то естественно из-за int64 т.к. факториал 25 число больше чем вмещает int64
0
5683 / 2274 / 466
Регистрация: 20.11.2009
Сообщений: 7,655
Записей в блоге: 1
29.12.2011, 15:14 5
у меня тоже все ОК идет вот все считает одинаковый результат

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function Fact1(n: Integer): Extended;
begin
  Result := 1;
  if n > 1 then
    Result := n*Fact1(n-1);
end;
 
function Fact2(n: Integer): Extended;
var i: Integer;
begin
  Result := 1;
  for i := 1 to n do
    Result := Result * i;
end;
 
function Fact3(n: Int64): Extended;
begin
  Result := 1;
  if n > 1 then
    Result := n*Fact3(n-1);
end;
 
function Fact4(n: Int64): Extended;
var i: Integer;
begin
  Result := 1;
  for i := 1 to n do
    Result := Result * i;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := FloatToStr(Fact1(1754));
  Label2.Caption := FloatToStr(Fact2(1754));
  Label3.Caption := FloatToStr(Fact3(1754));
  Label4.Caption := FloatToStr(Fact4(1754));
end;
это нашел максимальное что может высчитать факториал для типа Extended
Код
1,97926189010501E4930
Добавлено через 2 минуты
Цитата Сообщение от Predator_2004 Посмотреть сообщение
Может дело в этом:
Delphi
1
for i:=2 to x do
i:integer, а x:int64?
да тут же нету разницы, хоть с 1 хоть с 2 начинай, факториал 1 то будет 1, а 2 тоже будет 2, и Int64 и Integer тут роли не играют никакой, нам хватило бы значения хоть Byte для факториала числа 255
0
0 / 0 / 0
Регистрация: 25.11.2011
Сообщений: 10
30.12.2011, 03:20  [ТС] 6
ошибку на этой функции выдаёт
function FactDS(X: int64):extended;

Добавлено через 3 минуты
по формуле Джеймса Стирлинга не получается
Delphi
1
2
3
4
5
//--- формула Джеймса-Стирлинга
function FactDS(X: int64):extended;
begin
  Result:=round(SQRT(2*Pi*X)*Power(X/Exp(1),X));
end;
0
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
30.12.2011, 09:47 7
Цитата Сообщение от Flamepwnz Посмотреть сообщение
ошибку на этой функции выдаёт
function FactDS(X: int64):extended;
Цитата Сообщение от anonimus Посмотреть сообщение
естественно из-за int64 т.к. факториал 25 число больше чем вмещает int64
измени на extended
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
26.11.2012, 15:32 8
Надо написать программу вычисление факториала Z=X!, при этом значение X скопировать в поле Y.
Написал следующий код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TMainForm.ButtonClick(Sender: TObject);
 var f, x, i: longint; // Объявляем переменные.
begin
 EditZ.Clear; 
EditY.Text:=EditX.Text; 
 x:=StrToInt(EditX.Text); 
 f:=1; // Принимаем начальный результат за 1.
 for i := 1 to x do
 begin
  f:=f*i; // Находим факториал.
 end;
 if x<0 then ShowMessage('Факториал определен только для целых чисел > 0') 
 else EditZ.Text:=IntToStr(f) // Вывести результат.
end;
Но когда ввожу 32 или 33 ответ выходит -2147483648, что неправильно . А когда 34 и больше, ответ выходит 0 .

Затем я вспомнил, что диапазон longint до 2147484647 и сделал проверку.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TMainForm.ButtonClick(Sender: TObject);
 var f, x, i: longint; // Объявляем переменные.
begin
 EditZ.Clear; 
EditY.Text:=EditX.Text;  
 x:=StrToInt(EditX.Text); 
 f:=1; // Принимаем начальный результат за 1.
 for i := 1 to x do // Счетчик.
 begin
  f:=f*i; // Находим факториал.
 end;
 if x<0 then ShowMessage('Факториал определен только для целых чисел > 0');
 if (f>=-2147483648) or (f<=2147483647) then // Если факториал входит в диапазон Longint, то...
  EditZ.Text:=IntToStr(f) // ...вывести результат.
 else ShowMessage('Ошибка! Превышен диапазон Longint'); // Иначе вывести сообщение об ошибке.
end;
Но ничего не изменилось . Что не так?
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
29.11.2012, 08:30 9
Нашел в чем ошибка . Факториал вычисляется неправильно начиная не с 32, а с числа 13. 13! = 6227020800 > 2147483647, то есть факториал становиться больше диапазона Longint и калькулятор начинает показывать неверное значение. Я добавил проверки:
Delphi
1
2
3
 if (x>=13) then
  ShowMessage('Ошибка! Превышен диапазон Longint.') 
 else EditZ.Text:=IntToStr(f);
и
Delphi
1
 if x>=13 then EditZ.Text:='Факториал > Longint.';
После чего все стало нормально. Однако встает вопрос, как теперь находить факториал числа начиная с 13? Ведь обычный виндовский калькулятор не глючит при этом?!
0
0 / 0 / 1
Регистрация: 10.10.2011
Сообщений: 15
26.02.2013, 23:08 10
Тот же вопрос.
Вот мой код, пыталась добавить кнопку с факториалом, помогите разобраться тут (ошибка с переменной n)
пыталась учитывать, что значение факториала часто выходит за интежер

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit3: TEdit;
    Button5: TButton;
    Shape1: TShape;
    Shape2: TShape;
    Label1: TLabel;
    SpeedButton1: TSpeedButton;
    Label2: TLabel;
    Button7: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  Result,i: Real;
  function factorial(n: longint): longint;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Result:=Strtofloat(Edit1.Text)+Strtofloat(Edit2.Text);
  Edit3.Text:='Результат '+floattostr(Result);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Result:=Strtofloat(Edit1.Text)-Strtofloat(Edit2.Text);
  Edit3.Text:='Результат '+floattostr(Result);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  Result:=Strtofloat(Edit1.Text)*Strtofloat(Edit2.Text);
  Edit3.Text:='Результат '+floattostr(Result);
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  Result:=Strtofloat(Edit1.Text)/Strtofloat(Edit2.Text);
  Edit3.Text:='Результат '+floattostr(Result);
end;
 
procedure TForm1.Button5Click(Sender: TObject);
begin
Close;
end;
 
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  Result:=Strtofloat(Edit1.Text);
  i:=Result*pi/180;
  Edit3.Text:='Результат '+floattostr(sin(i));
end;
 
procedure TForm1.Button7Click(Sender: TObject);
begin
  Result:=Strtofloat(Edit1.Text);
  if n > 1 then factorial:=n * factorial(n-1)
           else factorial:= 1;
  Edit3.Text:='Результат'+floattostr(factorial);
end;
 
end.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2013, 23:08
Помогаю со студенческими работами здесь

Вычисление факториала
Ошибка дает на f := factorial(k); procedure TForm1.Button1Click(Sender: TObject); var...

Калькулятор, вычисление факториала
Необходим код простейшего калькулятора... (+ - * /) Из нестандартных операций нужен лишь n! (n...

Вычисление факториала - составить код по блок-схеме
Доброго времени суток, я как новенький в работе Delphi не могу сделать програмку в консольном...

Двоичный логарифм факториала
Всем привет. Нужно создать калькулятор, все арифметические действия я сделал, но никак не могу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru