# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > VB.NET > آموزش: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )

## فرید نجفلو

سلام بر اساتید عزیز
باتوجه به اینکه محاسبه فاکتوریل برای اعداد بزگتر از 170 با روش ها و انواع موجود(Double) امکان پذیر نیست :متفکر: 
واسه همین یه روش دیگه برای اینکار استفاده کردم که محاسبه فاکتوریل اعداد بزرگ امکان پذیره (معرف به !1000 که البته خیلی بیشتر از این رو محاسبه می کنه حوصله من تا 10.000 رو کشید! :چشمک:  )
با این توضیح که ماشین حساب خود ویندوز(7) بیشتر از 3248 رو نمی تونه حساب کنه!!! :قهقهه: 
Super Factorial.rar
انتقاد و پیشنهاد خودتون رو از من دریغ نکنید

----------


## JaVa

سلام....

ما که هر چی بالا پایینش کردیم سر در نیوردیم.
میشه توضیح بدی چیکار کردی ؟

پیشنهاد یه الگوریتم:

هر عدد که تولید میشه بزاریمش توی یه آرایه.
بعد آرایه رو چاپ کنیم.

----------


## tam2145

سلام
من که اصلا هیچی نفهمیدم فقط هی بالا و پایین می کردم ، آخر معلوم نشد کجا محاسبه می کنه !؟
حالا این آموزش بود فرید جون یا فقط سورس تنها ؟؟
توضیح ........

پیشنهاد :
بیایم بجای این که از اعداد استفاده کنیم از آرایه ها (( البته رشته هم می شود )) استفاده کنیم :
ابتدا هر رقم یک عدد را توی ردیف و ستون جداگانه ذخیره کنیم (( مثلا 231 : 2 را به 3-0 و 3 را 2-0 و ... )) و عدد دوم را توی یک آرایه دیگر ذخیره کنیم حالا بیایم و دو عدد را با استفاده از آرایه و باز سازی عمل ضرب برای آرایه ها اون دو عدد را ضرب کنیم و عدد حاصله توی یک آرایه 3t ذخیره کنیم حالا اینو با بعدی ضرب می کنیم و نتیجه را با بعدی تا تموم ضرب ها انجام شود !!

----------


## فرید نجفلو

از توجه تون ممنون




> ما که هر چی بالا پایینش کردیم سر در نیوردیم.
> 
> میشه توضیح بدی چیکار کردی ؟


\

مهمترین بخش متد دومه(MultiplyListAndInt)

این تابع یک لیست رو در یک عدد ضرب می کنه!
در وقع من عمل *ضرب سنتی* رو انجام میدم!




> پیشنهاد یه الگوریتم:
> 
> هر عدد که تولید میشه بزاریمش توی یه آرایه.
> بعد آرایه رو چاپ کنیم.


مگه اگورتیم من مشکلی داره؟
با روش شما هم سربار CPU و هم مقدار استفاده از حافظه به شدت بالا میره
همون طور که دید من تنها و فقط از یک لیست استفاده کردم (کم حجمتر از این؟!!)

اگه می خواید تک تک فاکتوریل ها رو به صورت پشت سر هم ببنید :
در تابع Fact بعد از خط زیر(داخل حلقه):

MultiplyListAndInt(ResultNumSet, i)

این خطوط رو اضافه کنید:

Dim aFact As String = ""
            For Each Digit As Byte In ResultNumSet
                aFact &= CStr(CInt(Digit))
            Next
        rtxRes.Text &=rtxRes.Text &  aFact & VbNewLine
 


باز اگه جایی ابهام هست من در خدمتم

----------


## فرید نجفلو

> سلام
> من که اصلا هیچی نفهمیدم فقط هی بالا و پایین می کردم ، آخر معلوم نشد کجا محاسبه می کنه !؟
> حالا این آموزش بود فرید جون یا فقط سورس تنها ؟؟
> توضیح ........
> 
> پیشنهاد :
> بیایم بجای این که از اعداد استفاده کنیم از آرایه ها (( البته رشته هم می شود )) استفاده کنیم :
> ابتدا هر رقم یک عدد را توی ردیف و ستون جداگانه ذخیره کنیم (( مثلا 231 : 2 را به 3-0 و 3 را 2-0 و ... )) و عدد دوم را توی یک آرایه دیگر ذخیره کنیم حالا بیایم و دو عدد را با استفاده از آرایه و باز سازی عمل ضرب برای آرایه ها اون دو عدد را ضرب کنیم و عدد حاصله توی یک آرایه 3t ذخیره کنیم حالا اینو با بعدی ضرب می کنیم و نتیجه را با بعدی تا تموم ضرب ها انجام شود !!


عزیم مشکل دقیقا همین جاست !!!
یعنی با پیشنهاد شما ما یه دفعه به جایی می رسیم که عدد داخل یکی از آرایه ها از حداکثر ظرفیت Double بیشتر می شه(خطای سر ریز OverFolwe!!!) :قهقهه:

----------


## tam2145

> عزیم مشکل دقیقا همین جاست !!!
> یعنی با پیشنهاد شما ما یه دفعه به جایی می رسیم که عدد داخل یکی از آرایه ها از حداکثر ظرفیت Double بیشتر می شه(خطای سر ریز OverFolwe!!!)


 این مشکل پیش نمی آید :
3 آرایه از نوع string می خواهیم که string هم تا 2 میلیارد کاراکتر هم جواب می دهد !!
هر رقم عدد را توی یک خونه قرار می دهیم حالا می اییم و خونه هایی که با هم باید ضرب شوند را ضرب می کنیم ، یکان می دهیم توی همون خونه و دهگان و ... را توی یک متغییر ذخیره و برای ظرب بعدی نگه می داریم تا ضرب که شد با این عدد جمع شود و  همون منوال !!
حالا حاصل ضرب را توی آرایه سوم ذخیره می کنیم !! حالا اون می دیم به آرایه اولی و دومی هم عدد جدید ، حاصل به آرایه سوم و ........ !! هنوز هم اشتباه هست ؟؟؟
یا اینکه من نمی تونم قشنگ توضیح بدهم و یا برداشت من از آرایه ها اشتباه است که نمی شه !!

----------


## فرید نجفلو

> این مشکل پیش نمی آید :
> 3 آرایه از نوع string می خواهیم که string هم تا 2 میلیارد کاراکتر هم جواب می دهد !!
> هر رقم عدد را توی یک خونه قرار می دهیم حالا می اییم و خونه هایی که با هم باید ضرب شوند را ضرب می کنیم ، یکان می دهیم توی همون خونه و دهگان و ... را توی یک متغییر ذخیره و برای ظرب بعدی نگه می داریم تا ضرب که شد با این عدد جمع شود و  همون منوال !!
> حالا حاصل ضرب را توی آرایه سوم ذخیره می کنیم !! حالا اون می دیم به آرایه اولی و دومی هم عدد جدید ، حاصل به آرایه سوم و ........ !! هنوز هم اشتباه هست ؟؟؟
> یا اینکه من نمی تونم قشنگ توضیح بدهم و یا برداشت من از آرایه ها اشتباه است که نمی شه !!


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

شمت کارکرد متد MultiplyListAndInt رو متوجه شدید که دارید ازش انتقاد می می کنید؟!!
اینا رو داشته باش تو پست بعدی توضیح می دم
آخه باید چند تا نقاشی واستون بکشم :قهقهه:

----------


## Heidari66

این سورسو پیدا کردم فکر کنم منظور دوستمون tam2145 تو همین سورس باشه...

----------


## فرید نجفلو

تابع Fact که توضیح لازم نداره فقط لیست رو می فرسته واسه ضرب

اما تابع MultiplyListAndInt :
ببینید من یک لیست دارم که حاوی جواب خواهد بود
ولی نه به صورت عدی در واقع اگر هر index لیست رو به صورت یک خانه در نظر بگیریم هر خانه نگه دارنده یک عدد از جواب(0 تا 9) خواهد بود
 اگه ما فرض کنیم که جواب نهایی 120 باشه لیست در آخر عملیات باید داری سه خانه که به ترتیب 1 و 2 و 0 هستند اگه اینا رو از ایندکس صفر پشت سر هم قرار بدیم می شه 120 یعنی جواب!

به این تصویر دقت کنید:

 
factorial.jpg
مثال رو با 5 فاکتوریل  توضیح می دم
می دونید که !5 بربر است با 2*3*4*5 البته چون یک بی تاثیره ننوشتم

خوب در ابتدای کار لیست من دارای یک خانه با مقدار 1 است که می تونید اونو جهت راحتی 2 هم بگیرید

حالا من می یام تو مرحله بعدی 2 رو در 3 ضرب می کنم
جواب می شه 6 من این 6 رو با 2 موجود در لیست جایگزین می کنم(همچنان جواب داخل لیست درسته)

نوبت میرسه به 4:
وقتی من لیست رو در 4 ضرب کنم جواب می شه *24* ولی لیست من یک خونه داره
همون طور که می دونید در عمل ضرب اگه عدد بزرگتر از 10 شد رقم یکان در محل خود باقی و بقیه به سمت چپ اضافه می شه و چون سمت چپ عدد از نظر ارزشی 10 برابر سمت راسته پس باید اول تقسیم بر 10 بشه بعد بره
با این توضیحات 4 با 6 جایگزین و 2 (20 تقسیم بر 10) رو در دست داریم
حالا این 2 رو باید چی کار کنیم؟
وقتی از حلقه خارج شدیم چک می کنیم ببینیم چیزی در دستمون مونده یا نه اگه مونده باشه یک خانه(والبته در حالت کلی به تعداد ارقام عدد) به لیست اضافه و عدد رو انتقال می دیم

پس الان لیست ما دو خانه داره با 2و4 که میشه 24 :چشمک: 

اگه ما دو باره این لیست رو با روش بالا ضرب کنیم لیستمون میشه 1و2و0 یا همون جواب نهایی 120
 فقط باید توجه داشته باشد که اگه عدد انتقالی بیش از یک رقم شد باید به تعداد ارقام اون خانه اضافه بشه
یعنی اگه لیست عدد 456789 رو نشون می ده و عدد انتقالی 123 است(بعد از تقسیم بر 10) باید بعد از جا گذاری به این شکل دربیاد
*123*456789
تا ازش های مکانی هم رعایت بشه

بازم در خدمتم

----------


## tam2145

> مننون خیلی قشنگ توضیح دادی
> من متوجه شدم که داری حی لقمه رو دور سرت می پیچونی
> من تقریبا دارم همین کار رو می کنم ولی لقمه رو درت گذاشتم تو دهنم
>  شمت کارکرد متد MultiplyListAndInt رو متوجه شدید که دارید ازش انتقاد می می کنید؟!!
> اینا رو داشته باش تو پست بعدی توضیح می دم
> آخه باید چند تا نقاشی واستون بکشم


 سلام فرید جون !!
دوربین مخفی و سرکاری هست ؟؟
خب تو که می گی راهم درسته چرا یه کاری می کنی که آدم به همین دانسته هاش چپکی بنگرد ؟؟ ها ؟؟؟ :افسرده: 
این قدر نخند ، مرض قند می گیری ، ها !!! :قهقهه:  :بامزه: 
من که تا حالا باهاش دیدار نداشتم تا امروز !! :چشمک: 
نقاشی ؟؟ حتما نقاش هم بابا شاه توی قهوه تلخ هست ؟؟!! :قهقهه:  :لبخند گشاده!:

----------


## فرید نجفلو

> نقاشی ؟؟ حتما نقاش هم بابا شاه توی قهوه تلخ هست ؟؟!!


اگه سرت شلوغ باشه و با Paint هم بکشی ای تقریبا  :قهقهه: 





> این قدر نخند ، مرض قند می گیری ، ها !!!
> من که تا حالا باهاش دیدار نداشتم تا امروز !!


خنده بر *هر درد* دواست

چون دوست دارم می خندم و گرنه من خیلی عبوس تشریف دارم :عصبانی: 
نترسی شو خی کردم :چشمک: 





> دوربین مخفی و سرکاری هست ؟؟
> خب تو که می گی راهم درسته چرا یه کاری می کنی که آدم به همین دانسته هاش چپکی بنگرد ؟؟ ها ؟؟؟


نه جان تو فقط یه تئاتر داریم همین

ببین می گم تو خط به خط بخون هر کدوم نفهمیدی اون خط رو  واست توضیح بدم
البته نرخ کلاس خصوصی یه کم فرق داره ها :قهقهه:

----------


## tam2145

> اگه سرت شلوغ باشه و با Paint هم بکشی ای تقریبا


 *البته بگم من سرم همیشه شلوغ هست !! تا فتوشاپ هست نیازی به اینا ندارم !! من گرافیکم از برنامه نویسیم بهتر هست !!*



> خنده بر *هر درد* دواست
>  چون دوست دارم می خندم و گرنه من خیلی عبوس تشریف دارم
> نترسی شو خی کردم


 *من اینجا همه رو می ترسونم ، الان بیام از ... بترسم !!* :قهقهه: 



> نه جان تو فقط یه تئاتر داریم همین
>  ببین می گم تو خط به خط بخون هر کدوم نفهمیدی اون خط رو  واست توضیح بدم
> البته نرخ کلاس خصوصی یه کم فرق داره ها


 *پول و ... ؟؟ من ؟؟ محل زندگی ام رو ببین !! هزینه های دیگه هم پیش کش !! ما چیز مفتکی دوست داریم !!* :چشمک: 
*بخشش اگه باهات شوخی کردم !! فقط خواستم یک آب و هوای عوض کرده باشم تو انجمن !!*

----------


## mostafarafinejad

فوق الاده بود ممنون

----------


## honey2000

> از توجه تون ممنون
> 
> \
> 
> مهمترین بخش متد دومه(MultiplyListAndInt)
> 
> این تابع یک لیست رو در یک عدد ضرب می کنه!
> در وقع من عمل *ضرب سنتی* رو انجام میدم!
> 
> ...


بخوایم تعداد مثلا ۶ ها رو در ۱۰۰۰ فاکتوریل حساب کنیم باید چیکار کرد؟

----------

