1 ضمیمه
سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
سلام بر اساتید عزیز
باتوجه به اینکه محاسبه فاکتوریل برای اعداد بزگتر از 170 با روش ها و انواع موجود(Double) امکان پذیر نیست:متفکر:
واسه همین یه روش دیگه برای اینکار استفاده کردم که محاسبه فاکتوریل اعداد بزرگ امکان پذیره (معرف به !1000 که البته خیلی بیشتر از این رو محاسبه می کنه حوصله من تا 10.000 رو کشید!:چشمک: )
با این توضیح که ماشین حساب خود ویندوز(7) بیشتر از 3248 رو نمی تونه حساب کنه!!!:قهقهه:
ضمیمه 83943
انتقاد و پیشنهاد خودتون رو از من دریغ نکنید
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
سلام....
ما که هر چی بالا پایینش کردیم سر در نیوردیم.
میشه توضیح بدی چیکار کردی ؟
پیشنهاد یه الگوریتم:
هر عدد که تولید میشه بزاریمش توی یه آرایه.
بعد آرایه رو چاپ کنیم.
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
سلام
من که اصلا هیچی نفهمیدم فقط هی بالا و پایین می کردم ، آخر معلوم نشد کجا محاسبه می کنه !؟
حالا این آموزش بود فرید جون یا فقط سورس تنها ؟؟
توضیح ........
پیشنهاد :
بیایم بجای این که از اعداد استفاده کنیم از آرایه ها (( البته رشته هم می شود )) استفاده کنیم :
ابتدا هر رقم یک عدد را توی ردیف و ستون جداگانه ذخیره کنیم (( مثلا 231 : 2 را به 3-0 و 3 را 2-0 و ... )) و عدد دوم را توی یک آرایه دیگر ذخیره کنیم حالا بیایم و دو عدد را با استفاده از آرایه و باز سازی عمل ضرب برای آرایه ها اون دو عدد را ضرب کنیم و عدد حاصله توی یک آرایه 3t ذخیره کنیم حالا اینو با بعدی ضرب می کنیم و نتیجه را با بعدی تا تموم ضرب ها انجام شود !!
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
از توجه تون ممنون
نقل قول:
ما که هر چی بالا پایینش کردیم سر در نیوردیم.
میشه توضیح بدی چیکار کردی ؟
\
مهمترین بخش متد دومه(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
باز اگه جایی ابهام هست من در خدمتم
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
نقل قول:
نوشته شده توسط
tam2145
سلام
من که اصلا هیچی نفهمیدم فقط هی بالا و پایین می کردم ، آخر معلوم نشد کجا محاسبه می کنه !؟
حالا این آموزش بود فرید جون یا فقط سورس تنها ؟؟
توضیح ........
پیشنهاد :
بیایم بجای این که از اعداد استفاده کنیم از آرایه ها (( البته رشته هم می شود )) استفاده کنیم :
ابتدا هر رقم یک عدد را توی ردیف و ستون جداگانه ذخیره کنیم (( مثلا 231 : 2 را به 3-0 و 3 را 2-0 و ... )) و عدد دوم را توی یک آرایه دیگر ذخیره کنیم حالا بیایم و دو عدد را با استفاده از آرایه و باز سازی عمل ضرب برای آرایه ها اون دو عدد را ضرب کنیم و عدد حاصله توی یک آرایه 3t ذخیره کنیم حالا اینو با بعدی ضرب می کنیم و نتیجه را با بعدی تا تموم ضرب ها انجام شود !!
عزیم مشکل دقیقا همین جاست !!!
یعنی با پیشنهاد شما ما یه دفعه به جایی می رسیم که عدد داخل یکی از آرایه ها از حداکثر ظرفیت Double بیشتر می شه(خطای سر ریز OverFolwe!!!):قهقهه:
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
نقل قول:
نوشته شده توسط
Farid.N
عزیم مشکل دقیقا همین جاست !!!
یعنی با پیشنهاد شما ما یه دفعه به جایی می رسیم که عدد داخل یکی از آرایه ها از حداکثر ظرفیت Double بیشتر می شه(خطای سر ریز OverFolwe!!!):قهقهه:
این مشکل پیش نمی آید :
3 آرایه از نوع string می خواهیم که string هم تا 2 میلیارد کاراکتر هم جواب می دهد !!
هر رقم عدد را توی یک خونه قرار می دهیم حالا می اییم و خونه هایی که با هم باید ضرب شوند را ضرب می کنیم ، یکان می دهیم توی همون خونه و دهگان و ... را توی یک متغییر ذخیره و برای ظرب بعدی نگه می داریم تا ضرب که شد با این عدد جمع شود و همون منوال !!
حالا حاصل ضرب را توی آرایه سوم ذخیره می کنیم !! حالا اون می دیم به آرایه اولی و دومی هم عدد جدید ، حاصل به آرایه سوم و ........ !! هنوز هم اشتباه هست ؟؟؟
یا اینکه من نمی تونم قشنگ توضیح بدهم و یا برداشت من از آرایه ها اشتباه است که نمی شه !!
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
نقل قول:
نوشته شده توسط
tam2145
این مشکل پیش نمی آید :
3 آرایه از نوع string می خواهیم که string هم تا 2 میلیارد کاراکتر هم جواب می دهد !!
هر رقم عدد را توی یک خونه قرار می دهیم حالا می اییم و خونه هایی که با هم باید ضرب شوند را ضرب می کنیم ، یکان می دهیم توی همون خونه و دهگان و ... را توی یک متغییر ذخیره و برای ظرب بعدی نگه می داریم تا ضرب که شد با این عدد جمع شود و همون منوال !!
حالا حاصل ضرب را توی آرایه سوم ذخیره می کنیم !! حالا اون می دیم به آرایه اولی و دومی هم عدد جدید ، حاصل به آرایه سوم و ........ !! هنوز هم اشتباه هست ؟؟؟
یا اینکه من نمی تونم قشنگ توضیح بدهم و یا برداشت من از آرایه ها اشتباه است که نمی شه !!
مننون خیلی قشنگ توضیح دادی:متفکر:
من متوجه شدم که داری حی لقمه رو دور سرت می پیچونی:قهقهه::قهقهه:
من تقریبا دارم همین کار رو می کنم ولی لقمه رو درت گذاشتم تو دهنم:چشمک:
شمت کارکرد متد MultiplyListAndInt رو متوجه شدید که دارید ازش انتقاد می می کنید؟!!
اینا رو داشته باش تو پست بعدی توضیح می دم
آخه باید چند تا نقاشی واستون بکشم:قهقهه:
1 ضمیمه
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
این سورسو پیدا کردم فکر کنم منظور دوستمون tam2145 تو همین سورس باشه...
1 ضمیمه
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
تابع Fact که توضیح لازم نداره فقط لیست رو می فرسته واسه ضرب
اما تابع MultiplyListAndInt :
ببینید من یک لیست دارم که حاوی جواب خواهد بود
ولی نه به صورت عدی در واقع اگر هر index لیست رو به صورت یک خانه در نظر بگیریم هر خانه نگه دارنده یک عدد از جواب(0 تا 9) خواهد بود
اگه ما فرض کنیم که جواب نهایی 120 باشه لیست در آخر عملیات باید داری سه خانه که به ترتیب 1 و 2 و 0 هستند اگه اینا رو از ایندکس صفر پشت سر هم قرار بدیم می شه 120 یعنی جواب!
به این تصویر دقت کنید:
مثال رو با 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
تا ازش های مکانی هم رعایت بشه
بازم در خدمتم
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
نقل قول:
نوشته شده توسط
Farid.N
مننون خیلی قشنگ توضیح دادی:متفکر:
من متوجه شدم که داری حی لقمه رو دور سرت می پیچونی:قهقهه::قهقهه:
من تقریبا دارم همین کار رو می کنم ولی لقمه رو درت گذاشتم تو دهنم:چشمک:
شمت کارکرد متد MultiplyListAndInt رو متوجه شدید که دارید ازش انتقاد می می کنید؟!!
اینا رو داشته باش تو پست بعدی توضیح می دم
آخه باید چند تا نقاشی واستون بکشم:قهقهه:
سلام فرید جون !!
دوربین مخفی و سرکاری هست ؟؟
خب تو که می گی راهم درسته چرا یه کاری می کنی که آدم به همین دانسته هاش چپکی بنگرد ؟؟ ها ؟؟؟:افسرده:
این قدر نخند ، مرض قند می گیری ، ها !!!:قهقهه::بامزه:
من که تا حالا باهاش دیدار نداشتم تا امروز !!:چشمک:
نقاشی ؟؟ حتما نقاش هم بابا شاه توی قهوه تلخ هست ؟؟!!:قهقهه::لبخند:
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
نقل قول:
نقاشی ؟؟ حتما نقاش هم بابا شاه توی قهوه تلخ هست ؟؟!!:قهقهه::لبخند:
اگه سرت شلوغ باشه و با Paint هم بکشی ای تقریبا :قهقهه:
نقل قول:
این قدر نخند ، مرض قند می گیری ، ها !!!:قهقهه::بامزه:
من که تا حالا باهاش دیدار نداشتم تا امروز !!:چشمک:
خنده بر هر درد دواست
چون دوست دارم می خندم و گرنه من خیلی عبوس تشریف دارم:عصبانی:
نترسی شو خی کردم:چشمک:
نقل قول:
دوربین مخفی و سرکاری هست ؟؟
خب تو که می گی راهم درسته چرا یه کاری می کنی که آدم به همین دانسته هاش چپکی بنگرد ؟؟ ها ؟؟؟:افسرده:
نه جان تو فقط یه تئاتر داریم همین
ببین می گم تو خط به خط بخون هر کدوم نفهمیدی اون خط رو واست توضیح بدم
البته نرخ کلاس خصوصی یه کم فرق داره ها:قهقهه:
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
نقل قول:
اگه سرت شلوغ باشه و با Paint هم بکشی ای تقریبا :قهقهه:
البته بگم من سرم همیشه شلوغ هست !! تا فتوشاپ هست نیازی به اینا ندارم !! من گرافیکم از برنامه نویسیم بهتر هست !!:لبخند:
نقل قول:
خنده بر هر درد دواست
چون دوست دارم می خندم و گرنه من خیلی عبوس تشریف دارم:عصبانی:
نترسی شو خی کردم:چشمک:
من اینجا همه رو می ترسونم ، الان بیام از ... بترسم !!:قهقهه:
نقل قول:
نه جان تو فقط یه تئاتر داریم همین
ببین می گم تو خط به خط بخون هر کدوم نفهمیدی اون خط رو واست توضیح بدم
البته نرخ کلاس خصوصی یه کم فرق داره ها:قهقهه:
پول و ... ؟؟ من ؟؟:متعجب: محل زندگی ام رو ببین !! هزینه های دیگه هم پیش کش !! ما چیز مفتکی دوست داریم !!:چشمک:
بخشش اگه باهات شوخی کردم !! فقط خواستم یک آب و هوای عوض کرده باشم تو انجمن !!:لبخندساده:
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
نقل قول: سورس: محاسبه فاکتوریل اعداد بسیار بزرگ(خیلی بیشتر از !1000 ;) )
نقل قول:
نوشته شده توسط
فرید نجفلو
از توجه تون ممنون
\
مهمترین بخش متد دومه(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
باز اگه جایی ابهام هست من در خدمتم
بخوایم تعداد مثلا ۶ ها رو در ۱۰۰۰ فاکتوریل حساب کنیم باید چیکار کرد؟