PDA

مشاهده نسخه کامل : احتساب فاکتوریل N



pooyi_khafan
23-06-09, 16:47
// facrotri.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
unsigned int f,i,n;
printf("Fact N");

for(int j=0;;j++)
{
f=1;
n=0;
printf("\nEnter Number: ");
scanf("%d",&n);
printf("%d! = ",n);
for(i=n;i>0;i--)
{
printf("%d",i);
f=f*i;
if(i!=1)
printf("x");
}
printf(" = %u", f);
}

return 0;
}

sAsAn.K
23-06-09, 21:45
تاپیک تغییر نام داده شد .

:give_rose:

™Ali
25-06-09, 18:51
این کد چه بدبختیه ! :1. (38):

من به شکل حرفه ای تر برنامه شو تو سی شارپ نوشتم :




Only the registered members can see the link


هر کی Source شو خواست PM بزنه تا بهش بدم :11():

PS:


این برنامه کلا از دو دستور For و Foreach فاکتوریل رو حساب می کنه. اما فاکتوریل n رو هنوز نتونستم برم چون متغیر double تا حدودا فاکتوریل 60-70 رو میتونه در خودش ذخیره کنه!
کسی از دوستان می دونم چجوری این مشکل رو میشه مرتفع کرد ؟ :yes:

MoBiN.R
25-06-09, 19:24
کد پویان جان یه کم پیچیدست و نیازم به این پیچیدگی نیست .. در ضمن توی برنامه فاکتوریل به فایل هدر #include "stdafx.h" اصلا نیازی نیست و نمیدونم اینجا چیکارست :دی ... در ضمن نیازی هم به این همه پیچیدگی تابع نیست .. من کد سادشو پایین مینویسم .. البته من برنامه علی جانو هنوز ندیدم .. اگر لطف کنه کدشو بزاری ممنون میشم



#include <stdio.h>
#include <conio.h>

void main()
{
int sum,i,n;

printf("Please Insert Number : ");
scanf("%d",&n);
for(i=0;i<=n;i++)
sum *= i;

printf("Fact is = %d",sum);
}

K A S R A
25-06-09, 23:15
اما فاکتوریل n رو هنوز نتونستم برم چون متغیر double تا حدودا فاکتوریل 60-70 رو میتونه در خودش ذخیره کنه!
کسی از دوستان می دونم چجوری این مشکل رو میشه مرتفع کرد ؟ :yes:





:whistle:
آهـــــــــــــا!!!!!
از این جا به بعدش دیگه کار ساختمان داده و طراحی الگوریتمه ... :cool:
تکنیک های کد نویسی و ساختمان داده های پویا اینجاس که رو میشه
فقط همینو بگم که با Data Type های خود #C نمیشه زیادتر از این جلو رفت .
موفق باشید
:11():

Stream
25-06-09, 23:25
استفاده از Stack نسبت به یک حلقه For برای پیدا کردن فاکتوریل بهینه تر نیست؟

™Ali
25-06-09, 23:27
اینم کد من (حدودا بعد از یه چند ساعت فکر این کد به مخم خطور کرد :1. (38):) :
البته اصل کد رو کذاشتم و متعلقاتش توش نیست !




int Fact = 1 ;
double.TryParse(txtBox.Text, out Count);
for (double x = Count; x > 0; x--)
{

Fact *= x;
}
lblResults.Text = Fact.ToString();





با این کد میشه دقیقا تا فاکتوریل 170 پیش رفت!
جدیدا یه کد انحصاری واسه شناسایی اعداد اول نوشتم که به زودی تو انجمن میذارم :wink:
راستی میشه بگید این کدی که پست اول گذاشتن به چه زبانیه ؟ :1. (38):

™Ali
25-06-09, 23:38
استفاده از Stack نسبت به یک حلقه For برای پیدا کردن فاکتوریل بهینه تر نیست؟

حلقه For معمولا واسه محاسبه اعداد Fibonachi و فاکتوریل و قرار دادن اعداد بسیار زیاد در یک آرایه و ... زیاد کاربرد داره.
تا به حال ندیدم کسی از <>Stack بیاد و فاکتوریل رو به دست بیاره. اگر کدی داری ممنون میشم بذاری :give_rose:

K A S R A
25-06-09, 23:38
استفاده از Stack نسبت به یک حلقه For برای پیدا کردن فاکتوریل بهینه تر نیست؟

به هیچ وجه !!!
برنامه های بازگشتی ( اگه منظورت استفاده از Stack سیستم باشه) سربار زیادی دارن ...
هر دفعه فراخوانی یعنی سیو کردن نتایج مرحله قبلی + زمان مورد نیاز برای ذخیره و بازیابی مجدد .

ولی اینجوری کد خیلی ساده و کوتاهی داره دو خطه :great:

به طور کلی بهتره برنامه های بازگشتیی که میشه با حلقه نوشت رو به صورت غیر بازگشتی و توی حلقه نوشت:cool:
هم زمان اجرا , هم سربار کمتره :yes:

اگه منظورت از Stack تعریف شده خود کاربر باشه بستگی داره چجوری میخوای ازش استفاده کنی ؟؟؟؟؟

Stream
25-06-09, 23:58
به هیچ وجه !!!
برنامه های بازگشتی ( اگه منظورت استفاده از Stack سیستم باشه) سربار زیادی دارن ...
هر دفعه فراخوانی یعنی سیو کردن نتایج مرحله قبلی + زمان مورد نیاز برای ذخیره و بازیابی مجدد .

ولی اینجوری کد خیلی ساده و کوتاهی داره دو خطه :great:

به طور کلی بهتره برنامه های بازگشتیی که میشه با حلقه نوشت رو به صورت غیر بازگشتی و توی حلقه نوشت:cool:
هم زمان اجرا , هم سربار کمتره :yes:

اگه منظورت از Stack تعریف شده خود کاربر باشه بستگی داره چجوری میخوای ازش استفاده کنی ؟؟؟؟؟
منظورم همون برنامه های بازگشتی بود.

درسته الان یک سرچ کردم مثل اینکه Iteration نسبت به Recursion از نظر Efficiency بهتر هست. من برعکسش رو فکر می کردم!

ممنون.

MoBiN.R
26-06-09, 10:35
راستی میشه بگید این کدی که پست اول گذاشتن به چه زبانیه ؟ Only the registered members can see the link

این برنامه با زبان C هست ..

در ضمن یه برنامه فاکتوریل ساده نسبتا جنبه آموزشی داره و کاربرد خاصی در پروژه های مختلف نداره .. برای همین نیاز به پیچیده کردنش نیست که بخوایم از Stack استفاده کنیم ..

Stream
26-06-09, 10:52
این برنامه با زبان C هست ..

در ضمن یه برنامه فاکتوریل ساده نسبتا جنبه آموزشی داره و کاربرد خاصی در پروژه های مختلف نداره .. برای همین نیاز به پیچیده کردنش نیست که بخوایم از Stack استفاده کنیم ..
استادهای دانشگاه از این چیزها از آدم می خوان دیگه! یادمه توی امتحان بهمون گفته بودن اعداد اول رو با Stack پیدا کنیم! :1~@$S:
(این استاد ما علاقه شدیدی به Stack و توابع Recursive داشت!)

MoBiN.R
26-06-09, 11:32
استادهای دانشگاه از این چیزها از آدم می خوان دیگه! یادمه توی امتحان بهمون گفته بودن اعداد اول رو با Stack پیدا کنیم! :1~@$S:
(این استاد ما علاقه شدیدی به Stack و توابع Recursive داشت!)


حتما این استادتون استاد ساخمان داده هست که میگه از Stack استفاده کنین تا راه بیوفتین ..آخه کدوم استاد برنامه نویسی میگه فاکتوریل رو با Stack بنویسین :1. (38): ( البته شایدم همچین استادی باشه :lol: ) .. البته با STack هم چیز خیلی سختی نیست فقط یه کم پیچیده میشه و به نظر روش بهینه ای نیست

Stream
26-06-09, 12:02
حتما این استادتون استاد ساخمان داده هست که میگه از Stack استفاده کنین تا راه بیوفتین ..آخه کدوم استاد برنامه نویسی میگه فاکتوریل رو با Stack بنویسین :1. (38): ( البته شایدم همچین استادی باشه :lol: ) .. البته با STack هم چیز خیلی سختی نیست فقط یه کم پیچیده میشه و به نظر روش بهینه ای نیست
درسته سخت نیست و توابع بازگشتی ساده هستند. این میشه فاکتوریل با Stack :


int fact(int x)
{
if(x=0)
return 1;
else
return x*fect(x-1);
}

ولی اعداد اول با استفاده از Stack بیش از حد مشکل بود! :2mo5pow:

MoBiN.R
26-06-09, 12:05
ما این روشو برا انجام عملیات خاصی با STack و توابع بازگشتی توی ساختمان داده داشتیم ( یادش بخیر ) .. اگر برنامه نویسی باشه 100 % از حلقه for برای حساب کردنش استفاده میکردن ..

™Ali
24-08-09, 01:28
یه سوال!

استفاده از این کدی که آرمان گذاشته واقعا سربار زیادی رو برای سیستم میاره!


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


int fact(int x)
{
if(x=0)
return 1;
else
return x*fect(x-1);
}ولی اعداد اول با استفاده از Stack بیش از حد مشکل بود! :2mo5pow:

MoBiN.R
24-08-09, 10:50
یه سوال!

استفاده از این کدی که آرمان گذاشته واقعا سربار زیادی رو برای سیستم میاره!


نه علی جان .. این کدی که آرمان گذاشته اتفاقا بدون حلقه هست و از روش Stack استفاده کرده و منابع سیستم به هدر نمیره .. البته شاید روی بعضی از عملیات ریاضی دیگه خیلی پیچیده بشه