PDA

View Full Version : تابع فاکتوریل بسط سینوس ایکس



khanomgol10002000
سه شنبه 30 بهمن 1386, 00:28 صبح
سلام.
ببخشید من برنامه ای رو نوشتم که قراره مجموع بیست سری اول بسی سینوس ایکس رو محاسبه کنه.که باید از تابع فاکتوریل استفاده کرد.اما تابع من فقط قادره فاکتوریل 17سری اول رو حساب کنه به نظر شما مشکل از چیه؟
long int fact(int n)
{
if(n==0)
return 1;
return (n*fact(n-1));
}
البته پرانتزها و کروشه ها رو درست گذاشتما :لبخند:اینجا کپی زدم اینجوری شدن:افسرده:

Nima_NF
سه شنبه 30 بهمن 1386, 17:10 عصر
جواب فاکتوریل و توان شما در بسط سینوس ، پس از چند محاسبه مقدار بسیار بزرگی می شود ، یعنی با توجه به فاکتوریل 2n+1 عددی بالای 40 رقم می شود و همین طور برای توان آن ، که شما نیاز به استفاده از الگوریتم های عملیاتی بر روی اعداد بزرگ دارید.
(حال یا خودتان می نویسید یا از کتابخانه های موجود استفاده می کنید)

در همین بخش جستجو کنید "فاکتوریل" تا به برخی از جواب ها برسید.
ضمنا در بخش الگوریتم ها هم برای اعداد بزرگ جستجو کنید که قبلا بحث شده است.

pesar irooni
سه شنبه 30 بهمن 1386, 21:15 عصر
باید به دنبال عددی باشی 164 بیتی
یعنی 21 بایتی چون 41! عددی میشه که نیاز به 164 بیت داره
فکر کنم باید از آرایه ها کمک بگیری

pesar irooni
چهارشنبه 01 اسفند 1386, 01:30 صبح
سلام عزیز جان

دو تا راه حل برات پیدا کردم:
اول همون کمک گرفتن ار آرایه هاست.
این کد که اینجا گذاشتم به زبان پاسکال، هر عددی بدی فاکتوریلش رو حساب میکنه
فکر کنم تا حول و هوش 1000 هم حساب کنه. من تا 100! زدم جواب داد
حالا کدش رو میذارم


program factorial (input,output);
var
zero,i,j,carry,n,x : integer;
A: array [0..99] of integer;
begin (* main *)

readln(n);
while (n > 0) do begin
if (n <= 1) then writeln('1')
else
begin
A[0]:=1;
for j:=1 to 99 do A[j]:=0;

for i:= 2 to n do
begin
carry:=0;
for j:=0 to 99 do
begin
x:= A[j]*i+carry;
A[j]:= (x mod 10);
carry:= x div 10;
end
end;
zero:=99;
while (A[zero]=0) do zero:=zero-1;
for j:=zero downto 0 do
write(A[j]:1);
writeln;
end;
readln(n);
end;

end.

pesar irooni
چهارشنبه 01 اسفند 1386, 01:53 صبح
راه حل دوم که بهتره:
کمک گرفتن از لگاریتم
میدونیم که log(x*y) = log x + log y یعنی
log(n*(n-1)!) = log n + log (n-1)!
پس :

log(N!) = SUM log(k) FOR k = 1 to N
پس جواب ما میشه 10 به توان !log n
حالا برای اینکه جواب دقیق رو بتونیم نشون بدیم باید از نماد علمی(E) استفاده کنیم
پس یعنی یه قسمت پایه میخواهیم و یه قسمت توان


C = floor(log(N!))
M = log(N!) - floor(log(N!))

N! = (10^M) * 10^C

قسمت توان میشه 10 به توان بخش صحیح عدد !log n و قسمت پایه میشه 10 به توان بخش اعشاری(عددی بین 0 و 1) عدد !log n که یه عدد بین 0 تا 10 میشه
برای مثال
فاکتوریل عدد 20 میشه
2.432902008 e +18
برای محاسبه به روش فوق ما اول لگاریتم !20 رو حساب می کنیم که میشه 18.38612462
خوب 18 که بخش صحیحه عدد همون توان E میشه یعنی 10 به توان 18
و بخش اعشاری یعنی 0.38612462 یه عدد بین 0 و 1 است که اگه 10 به توان این عدد بشه میشه یه عدد بین 0 و 10 که اگه محاسبه کنی میبینی میشه 2.432902008 یعنی قسمت پایه عدد

خوب اینم راه حل هایی که برای محاسبه فاکتوریل عدد یزرگ وجود داشت. امید وارم بدردت بخوره