PDA

View Full Version : محاسبه فاکتوریل



ghafar.t.d
یک شنبه 19 تیر 1384, 09:41 صبح
با سلام
در برنامه نویسی با دلفی در نوشتن ماشین حساب برای محاسبه فاکتوریل چه کدی بنویسیم که فاکتوریل اعداد بزرگتر را هم حساب بکنه من کد زیر را می نویسم ولی اعداد کوچیک را فقط حساب می کنه برای اعداد بزرگ چه باید کرد ؟؟
var
f,n: LongInt;
i: Integer;
begin
n:=strtoint (edit.Text);
f := 1;
for i := 1 to n do
f := f * i;
edit.Text:=inttostr (f);
end;
end;

Mahdi_S_T
یک شنبه 19 تیر 1384, 10:11 صبح
فکر کنم از Int64 باید استفاده کنی

Delphi Skyline
یک شنبه 19 تیر 1384, 10:15 صبح
فکر کنم از Int64 باید استفاده کنی


بله درسته .

بزنید system. بعد تمام متغیر ها رو میاره .

Mahdi_S_T
یک شنبه 19 تیر 1384, 13:34 عصر
اگه اعداد مثلا 200 رقمی بخوای باید از آرایه استفاده کنی از توابع زیر هم می تونی استفاده کنی

program Zarb_Jam_Taghsim_Menha_40Ragham;
uses crt;
var
i,j,toln1,toln2,a,b,code,cary,k,tempint,ii:integer ;
n1,n2,n,tempstr:string;
nn:array[1..200] of string;
o:char;

function IntToStr(II: integer): String;
var
S: string;
begin
Str(II, S);
IntToStr := S;
end;
function StrToInt(II: string): integer;
var
S: integer;
begin
val(ii,s,code);
StrToint := S;
end;

procedure jam;
begin
toln1:=length(n1);
toln2:=length(n2);
cary:=0;
n:='';
for i:=toln1 downto 1 do
begin
a:=strtoint(n1[i]);
b:=strtoint(n2[toln2]);
if toln2<>0 then
Dec(toln2)
else
b:=0;
if a+b+cary<=9 then
begin
n:=inttostr(a+b+cary)+n;
cary:=0
end
else
begin
n:=inttostr((a+b+cary)mod 10)+n;
cary:=1;
end;
end;
if cary=1 then
n:=inttostr(cary)+n;

writeln;
for i:=1 to length(n) do
write(n[i]);

end;
procedure menha;
begin
toln1:=length(n1);
toln2:=length(n2);
n:='';
for i:=toln1 downto 1 do
begin
a:=strtoint(n1[i]);
b:=strtoint(n2[toln2]);
if toln2<>0 then
Dec(toln2)
else
b:=0;
if a-b>=0 then
n:=inttostr(a-b)+n
else
begin
tempstr:=inttostr(strtoint(n1[i-1])-1);
n1[i-1]:=tempstr[1];
n:=inttostr(((a+10)-b))+n;
end;
end;
writeln;
for i:=1 to length(n) do
write(n[i]);
end;

procedure zarb;
begin
toln1:=length(n1);
toln2:=length(n2);
cary:=0;
k:=1;
for i:=toln2 downto 1 do
begin
cary:=0;
a:=strtoint(n2[i]);
for j:=toln1 downto 1 do
begin
b:=strtoint(n1[j]);
if a*b+cary<=9 then
begin
nn[k]:=inttostr(a*b+cary)+nn[k];
cary:=0
end
else
begin
nn[k]:=inttostr((a*b+cary)mod 10)+nn[k];
tempint:=(a*b+cary);
tempint:=tempint div 10;
cary:=tempint;
end;
end;
if cary>0 then
nn[k]:=inttostr(cary)+nn[k];
Inc(k);
for ii:=1 to k-1 do
nn[k]:='0'+nn[k];
end;
Dec(k);
{ for i:=1 to k do
writeln(nn[i]);}

n1:=nn[k];
n2:=nn[k-1];
n:='';
for ii:=k-2 downto 0 do
begin
toln1:=length(n1);
toln2:=length(n2);
cary:=0;
n:='';
for i:=toln1 downto 1 do
begin
a:=strtoint(n1[i]);
b:=strtoint(n2[toln2]);
if toln2<>0 then
Dec(toln2)
else
b:=0;
if a+b+cary<=9 then
begin
n:=inttostr(a+b+cary)+n;
cary:=0
end
else
begin
n:=inttostr((a+b+cary)mod 10)+n;
cary:=1;
end;
end;
if cary=1 then
n:=inttostr(cary)+n;

n1:=n;
n2:=nn[ii];
end;
writeln;
for i:=1 to length(n) do
write(n[i]);

end;
procedure taghsim;
begin


end;
begin
clrscr;
Write('Insert Number One :');
readln(n1);
Write('Insert Number One :');
readln(n2);
if length(n2)>length(n1) then
begin
tempstr:=n1;
n1:=n2;
n2:=tempstr;
end
else
if (length(n2)=length(n1)) and (strtoint(n2[1])>strtoint(n1[1])) then
begin
tempstr:=n1;
n1:=n2;
n2:=tempstr;
end;

Write('Insert Operator * or + or - or / :');
readln(o);
case o of
'+':jam;
'-':menha;
'*':zarb;
'/':taghsim;
end;



readln;
end.

SalarSoft
یک شنبه 19 تیر 1384, 17:50 عصر
بزرگترین نوع عددی در دلفی Extended است که اعشاریه و تا 20 رقم طول داره.

ghafar.t.d
دوشنبه 20 تیر 1384, 08:03 صبح
با سلام
extended مال اعشاریه ولی فاکتوریل فقط برای اعداد صحیح استفاده میشه
برای نوشتن فاکتوریل با آرایه چیکار باید کرد ؟

hr110
دوشنبه 20 تیر 1384, 08:11 صبح
سلام
قبلاً جواب داده شده است : شما کافی است که دو عملگر + و * را برای آرایه‌ها پیاده‌سازی کنید و از این دو عملگر میتوانید برای محاسبه فاکتوریل استفاده کنید.

SalarSoft
دوشنبه 20 تیر 1384, 18:47 عصر
extended مال اعشاریه ولی فاکتوریل فقط برای اعداد صحیح استفاده میشه
نتیجه فاکتوریل شما که در این نوع متغیر قرار میگیرد. پس فرقی نخواهد داشت که اعشاری باشد یا نه.
در ضمن برای فاکتوریل تا حدود 1754 میتوانید از extended استفاده کنید. و برای محاسبات کوچک مناسب است.
نمونه کد:

function Factorial(N: Extended): Extended;
var
I:integer;
begin
Result:=1;
for i:=1 to Trunc(N) do begin
Result:=Result*i;
end;
end;

مهدی ص
دوشنبه 24 مهر 1385, 15:29 عصر
اگه اعداد مثلا 200 رقمی بخوای باید از آرایه استفاده کنی از توابع زیر هم می تونی استفاده کنی

program Zarb_Jam_Taghsim_Menha_40Ragham;
uses crt;
var
i,j,toln1,toln2,a,b,code,cary,k,tempint,ii:integer ;
n1,n2,n,tempstr:string;
nn:array[1..200] of string;
o:char;

function IntToStr(II: integer): String;
var
S: string;
begin
Str(II, S);
IntToStr := S;
end;
function StrToInt(II: string): integer;
var
S: integer;
begin
val(ii,s,code);
StrToint := S;
end;

procedure jam;
begin
toln1:=length(n1);
toln2:=length(n2);
cary:=0;
n:='';
for i:=toln1 downto 1 do
begin
a:=strtoint(n1[i]);
b:=strtoint(n2[toln2]);
if toln2<>0 then
Dec(toln2)
else
b:=0;
if a+b+cary<=9 then
begin
n:=inttostr(a+b+cary)+n;
cary:=0
end
else
begin
n:=inttostr((a+b+cary)mod 10)+n;
cary:=1;
end;
end;
if cary=1 then
n:=inttostr(cary)+n;

writeln;
for i:=1 to length(n) do
write(n[i]);

end;
procedure menha;
begin
toln1:=length(n1);
toln2:=length(n2);
n:='';
for i:=toln1 downto 1 do
begin
a:=strtoint(n1[i]);
b:=strtoint(n2[toln2]);
if toln2<>0 then
Dec(toln2)
else
b:=0;
if a-b>=0 then
n:=inttostr(a-b)+n
else
begin
tempstr:=inttostr(strtoint(n1[i-1])-1);
n1[i-1]:=tempstr[1];
n:=inttostr(((a+10)-b))+n;
end;
end;
writeln;
for i:=1 to length(n) do
write(n[i]);
end;

procedure zarb;
begin
toln1:=length(n1);
toln2:=length(n2);
cary:=0;
k:=1;
for i:=toln2 downto 1 do
begin
cary:=0;
a:=strtoint(n2[i]);
for j:=toln1 downto 1 do
begin
b:=strtoint(n1[j]);
if a*b+cary<=9 then
begin
nn[k]:=inttostr(a*b+cary)+nn[k];
cary:=0
end
else
begin
nn[k]:=inttostr((a*b+cary)mod 10)+nn[k];
tempint:=(a*b+cary);
tempint:=tempint div 10;
cary:=tempint;
end;
end;
if cary>0 then
nn[k]:=inttostr(cary)+nn[k];
Inc(k);
for ii:=1 to k-1 do
nn[k]:='0'+nn[k];
end;
Dec(k);
{ for i:=1 to k do
writeln(nn[i]);}

n1:=nn[k];
n2:=nn[k-1];
n:='';
for ii:=k-2 downto 0 do
begin
toln1:=length(n1);
toln2:=length(n2);
cary:=0;
n:='';
for i:=toln1 downto 1 do
begin
a:=strtoint(n1[i]);
b:=strtoint(n2[toln2]);
if toln2<>0 then
Dec(toln2)
else
b:=0;
if a+b+cary<=9 then
begin
n:=inttostr(a+b+cary)+n;
cary:=0
end
else
begin
n:=inttostr((a+b+cary)mod 10)+n;
cary:=1;
end;
end;
if cary=1 then
n:=inttostr(cary)+n;

n1:=n;
n2:=nn[ii];
end;
writeln;
for i:=1 to length(n) do
write(n[i]);

end;
procedure taghsim;
begin


end;
begin
clrscr;
Write('Insert Number One :');
readln(n1);
Write('Insert Number One :');
readln(n2);
if length(n2)>length(n1) then
begin
tempstr:=n1;
n1:=n2;
n2:=tempstr;
end
else
if (length(n2)=length(n1)) and (strtoint(n2[1])>strtoint(n1[1])) then
begin
tempstr:=n1;
n1:=n2;
n2:=tempstr;
end;

Write('Insert Operator * or + or - or / :');
readln(o);
case o of
'+':jam;
'-':menha;
'*':zarb;
'/':taghsim;
end;



readln;
end.

اگه میشه لطف کنید و متغیر ها را معرفی کنید
i,j,toln1,toln2,a,b,code,cary,k,tempint,ii
n1,n2,n,tempstr
ممنون

Tasnim
دوشنبه 24 مهر 1385, 16:35 عصر
بهتر مقدار متغییرتو افزایش بدی

RED-C0DE
شنبه 02 تیر 1386, 19:02 عصر
محاسبه فاکتوریل تا50000 رقم و بیشتر (توی ++C ، کل الگوریتمش 6 خطه ...) :
http://barnamenevis.org/forum/attachment.php?attachmentid=9374&d=1182623125
(http://barnamenevis.org/forum/attachment.php?attachmentid=9371&d=1182614389)

dkhatibi
یک شنبه 03 تیر 1386, 16:00 عصر
من تا 15000 را تو دلفی حساب کرده ام. درصورتیکه برنامشو پیدا کردم می گذارم.