PDA

View Full Version : آموزش: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )



فرید نجفلو
شنبه 20 اسفند 1390, 11:53 صبح
سلام بر اساتید عزیز
باتوجه به اینکه محاسبه فاکتوریل برای اعداد بزگتر از 170 با روش ها و انواع موجود(Double) امکان پذیر نیست:متفکر:
واسه همین یه روش دیگه برای اینکار استفاده کردم که محاسبه فاکتوریل اعداد بزرگ امکان پذیره (معرف به !1000 که البته خیلی بیشتر از این رو محاسبه می کنه حوصله من تا 10.000 رو کشید!:چشمک: )
با این توضیح که ماشین حساب خود ویندوز(7) بیشتر از 3248 رو نمی تونه حساب کنه!!!:قهقهه:
83943
انتقاد و پیشنهاد خودتون رو از من دریغ نکنید

JaVa
شنبه 20 اسفند 1390, 12:18 عصر
سلام....

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

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

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

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

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

فرید نجفلو
شنبه 20 اسفند 1390, 12:41 عصر
از توجه تون ممنون


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

میشه توضیح بدی چیکار کردی ؟\

مهمترین بخش متد دومه(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



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

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

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

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

tam2145
شنبه 20 اسفند 1390, 13:06 عصر
عزیم مشکل دقیقا همین جاست !!!
یعنی با پیشنهاد شما ما یه دفعه به جایی می رسیم که عدد داخل یکی از آرایه ها از حداکثر ظرفیت Double بیشتر می شه(خطای سر ریز OverFolwe!!!):قهقهه:
این مشکل پیش نمی آید :
3 آرایه از نوع string می خواهیم که string هم تا 2 میلیارد کاراکتر هم جواب می دهد !!
هر رقم عدد را توی یک خونه قرار می دهیم حالا می اییم و خونه هایی که با هم باید ضرب شوند را ضرب می کنیم ، یکان می دهیم توی همون خونه و دهگان و ... را توی یک متغییر ذخیره و برای ظرب بعدی نگه می داریم تا ضرب که شد با این عدد جمع شود و همون منوال !!
حالا حاصل ضرب را توی آرایه سوم ذخیره می کنیم !! حالا اون می دیم به آرایه اولی و دومی هم عدد جدید ، حاصل به آرایه سوم و ........ !! هنوز هم اشتباه هست ؟؟؟
یا اینکه من نمی تونم قشنگ توضیح بدهم و یا برداشت من از آرایه ها اشتباه است که نمی شه !!

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

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

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

Heidari66
شنبه 20 اسفند 1390, 14:32 عصر
این سورسو پیدا کردم فکر کنم منظور دوستمون tam2145 تو همین سورس باشه...

فرید نجفلو
شنبه 20 اسفند 1390, 14:38 عصر
تابع Fact که توضیح لازم نداره فقط لیست رو می فرسته واسه ضرب

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

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



83956


مثال رو با 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) باید بعد از جا گذاری به این شکل دربیاد
123456789
تا ازش های مکانی هم رعایت بشه

بازم در خدمتم

tam2145
شنبه 20 اسفند 1390, 14:42 عصر
مننون خیلی قشنگ توضیح دادی:متفکر:
من متوجه شدم که داری حی لقمه رو دور سرت می پیچونی:قهقهه::قهقهه:
من تقریبا دارم همین کار رو می کنم ولی لقمه رو درت گذاشتم تو دهنم:چشمک:
شمت کارکرد متد MultiplyListAndInt رو متوجه شدید که دارید ازش انتقاد می می کنید؟!!
اینا رو داشته باش تو پست بعدی توضیح می دم
آخه باید چند تا نقاشی واستون بکشم:قهقهه:
سلام فرید جون !!
دوربین مخفی و سرکاری هست ؟؟
خب تو که می گی راهم درسته چرا یه کاری می کنی که آدم به همین دانسته هاش چپکی بنگرد ؟؟ ها ؟؟؟:افسرده:
این قدر نخند ، مرض قند می گیری ، ها !!!:قهقهه::بامزه:
من که تا حالا باهاش دیدار نداشتم تا امروز !!:چشمک:
نقاشی ؟؟ حتما نقاش هم بابا شاه توی قهوه تلخ هست ؟؟!!:قهقهه::لبخند:

فرید نجفلو
شنبه 20 اسفند 1390, 14:59 عصر
نقاشی ؟؟ حتما نقاش هم بابا شاه توی قهوه تلخ هست ؟؟!!:قهقهه::لبخند:
اگه سرت شلوغ باشه و با Paint هم بکشی ای تقریبا :قهقهه:



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

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



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


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

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

tam2145
شنبه 20 اسفند 1390, 15:17 عصر
اگه سرت شلوغ باشه و با Paint هم بکشی ای تقریبا :قهقهه:
البته بگم من سرم همیشه شلوغ هست !! تا فتوشاپ هست نیازی به اینا ندارم !! من گرافیکم از برنامه نویسیم بهتر هست !!:لبخند:

خنده بر هر درد دواست
چون دوست دارم می خندم و گرنه من خیلی عبوس تشریف دارم:عصبانی:
نترسی شو خی کردم:چشمک:
من اینجا همه رو می ترسونم ، الان بیام از ... بترسم !!:قهقهه:

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

mostafarafinejad
شنبه 14 بهمن 1391, 21:19 عصر
فوق الاده بود ممنون

honey2000
شنبه 28 فروردین 1400, 11:43 صبح
از توجه تون ممنون

\

مهمترین بخش متد دومه(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



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

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