View Full Version : سوال: برنامه فاکتوریل
tanha70
یک شنبه 04 مهر 1389, 23:43 عصر
سلام دوستان
میخواستم یه برنامه فاکتوریل بنویسم که فاکتوریل اعداد یزرگی مثل 10000 را هم حساب کند.
لطفا سریع تر راهنمایی کنید که خیلی لازم دارم.
jlover
دوشنبه 05 مهر 1389, 01:10 صبح
مطمئنن الگوریتمشو که نمیخواین! چون هم خیلی ساده ست و هم به این تالار مربوط نمیشه...
اما برای نگهداری اعداد خیلی بزرگ از کلاسهای BigInteger و BigDecimal استفاده میشه
پس شما کافیه که نتیجه ی محاسبه تون (10000*9999*9998*...*1) رو در یک نمونه از BigInteger قرار بدید
tanha70
دوشنبه 05 مهر 1389, 10:11 صبح
حالا این biginteger اعداد چند رقمی رو میتونه تو خودش ذخیره کنه
راستش من میخوام برنامه بتونه اعداد خیلی بزرگتر از 100000000000000 رو هم جواب بده
منظورم اینه که فاکتوریل هر عددی رو بتونه حساب کنه
حالا بک هفته یا یک ماه هم طول بکشه مشکلی نداره.
از راهنماییهاتون بسیار متشکرم.
amirfarshad
دوشنبه 05 مهر 1389, 22:16 عصر
اگر درست یادم باشه biginteger تا اعداد حدود ۳۰۸ رقمی رو در خودش جا میده. شما اگر میخواهید که فاکتوریل بزرگتر از این رو محاسبه کنید، نمیتونید از دیتاتایپهای عددی استفاده کنید. به جای آنها از string و character باید استفاده کرد.
متاسفانه یک سایتی که خیلی دقیق روی این گونه محاسبات کار کرده بود (البته با c)، فعلا از کار افتاده. ولی با کمی گوگل در بین سایتهای فارسی زبان چیزهای خوبی پیدا میشه
jlover
سه شنبه 06 مهر 1389, 05:30 صبح
حالا این biginteger اعداد چند رقمی رو میتونه تو خودش ذخیره کنه
راستش من میخوام برنامه بتونه اعداد خیلی بزرگتر از 100000000000000 رو هم جواب بده
منظورم اینه که فاکتوریل هر عددی رو بتونه حساب کنه
حالا بک هفته یا یک ماه هم طول بکشه مشکلی نداره.
از راهنماییهاتون بسیار متشکرم.
شما تشریف ببرید مستندات این کلاس رو مطالعه کنید، کاری که شما در نظر دارید انجام بدید رو حتی میشه در یک حلقه ی for اون هم بدون بدنه تمام کرد!
از لحاظ نظری فقط حافظه ی کامپیوتر میتونه جلودارش باشه...
اگر درست یادم باشه biginteger تا اعداد حدود ۳۰۸ رقمی رو در خودش جا میده. شما اگر میخواهید که فاکتوریل بزرگتر از این رو محاسبه کنید، نمیتونید از دیتاتایپهای عددی استفاده کنید. به جای آنها از string و character باید استفاده کرد.
متاسفانه یک سایتی که خیلی دقیق روی این گونه محاسبات کار کرده بود (البته با c)، فعلا از کار افتاده. ولی با کمی گوگل در بین سایتهای فارسی زبان چیزهای خوبی پیدا میشه
عجب! مطمئنید همون BigInteger در بسته ی java.math منظورتون هست!؟
اینجا (http://forums.sun.com/thread.jspa?threadID=5389416) بحث جالبی در گرفته بوده، میتونید یه نگاهی بهش بندازید (رقمی که اونجا مطرحه چهار هزار و خورده ای هست...)
در ضمن منظورتون از دیتاتایپهای عددی چی هست؟ اگه انواع اولیه مثل int, byte یا long هست، باید خدمتتون عرض کنم که BigInteger از نوع کلاس و یک شیء محسوب میشه که بنا به گفته ی همونایی که اونجا بحث کردند از آرایه ای از int ها استفاده میکنه...(من خودم دیگه نگاه نکردم به کدهای منبعش، کلاس ساده ای نیست...)
---------------------------------------------------
راستی واسه عدد صدهزار رو حساب کرد فاکتوریلشو، شد 456,574 رقم در سه دقیقه و خورده ای با همون الگوریتم خیلی ساده و واضحی که گفتم یه حلقه ی for داره فقط
amirfarshad
سه شنبه 06 مهر 1389, 08:46 صبح
عجب! مطمئنید همون BigInteger در بسته ی java.math منظورتون هست!؟
اینجا (http://forums.sun.com/thread.jspa?threadID=5389416) بحث جالبی در گرفته بوده، میتونید یه نگاهی بهش بندازید (رقمی که اونجا مطرحه چهار هزار و خورده ای هست...)
در ضمن منظورتون از دیتاتایپهای عددی چی هست؟ اگه انواع اولیه مثل int, byte یا long هست، باید خدمتتون عرض کنم که BigInteger از نوع کلاس و یک شیء محسوب میشه که بنا به گفته ی همونایی که اونجا بحث کردند از آرایه ای از int ها استفاده میکنه...(من خودم دیگه نگاه نکردم به کدهای منبعش، کلاس ساده ای نیست...)
---------------------------------------------------
راستی واسه عدد صدهزار رو حساب کرد فاکتوریلشو، شد 456,574 رقم در سه دقیقه و خورده ای با همون الگوریتم خیلی ساده و واضحی که گفتم یه حلقه ی for داره فقط
خودم گفتم که دقیق یادم نیست، این عددی که گفتم به ذهنم اومد، حالا سر فرصت میگردم و دقیقتر میگم که که این چی بود که گفتم. لینک رو هم نگاه خواهم کرد، ممنون.
اگر توی نوشته های من بگردید، (حدود یک سال پیش یا کمی بیشتر) داشتم روی همین قضیه کار میکردم، البته اون موقع در مورد جمع اعداد بزرگ اینجا سوال کرده بودم. اون موقع به محدودیتهایی رسیده بودم که از یکجایی به بعد رو نمیشد با BigInteger انجام داد. بر همون اساس نوشته های بالا رو نوشتم. اون موقع پیشنهاد کار با String رو به من دادند (البته توی همون سایتی که گفتم در دسترس نیست).
وقتی فاکتوریل عددی رو محاسبه میکنید، مشخصات سیستمی رو هم که روش کار کردین رو بگید. این مشخصات خیلی تاثیر داره روی زمان.
jlover
سه شنبه 06 مهر 1389, 09:22 صبح
خودم گفتم که دقیق یادم نیست، این عددی که گفتم به ذهنم اومد، حالا سر فرصت میگردم و دقیقتر میگم که که این چی بود که گفتم. لینک رو هم نگاه خواهم کرد، ممنون.
اگر توی نوشته های من بگردید، (حدود یک سال پیش یا کمی بیشتر) داشتم روی همین قضیه کار میکردم، البته اون موقع در مورد جمع اعداد بزرگ اینجا سوال کرده بودم. اون موقع به محدودیتهایی رسیده بودم که از یکجایی به بعد رو نمیشد با BigInteger انجام داد. بر همون اساس نوشته های بالا رو نوشتم. اون موقع پیشنهاد کار با String رو به من دادند (البته توی همون سایتی که گفتم در دسترس نیست).
وقتی فاکتوریل عددی رو محاسبه میکنید، مشخصات سیستمی رو هم که روش کار کردین رو بگید. این مشخصات خیلی تاثیر داره روی زمان.
روی زمان تاثیر داره، نه روی توانایی محاسبه ش یا نه. البته اول عدد 10100000000000000 رو امتحان کردم بعد از حدود دو ساعت متوقفش کردم
به هر حال رقم نتیجه خودش شش رقم بوده
سیستم من هم چیز خاصی نداره:
amd athlon64 3000+ (2GH) and 2GB of RAM
tanha70
سه شنبه 06 مهر 1389, 17:04 عصر
سلام
ممنونم از همکاری شما دوستان.
sorroshsaket
سه شنبه 18 آبان 1389, 14:33 عصر
biginteger محدودیت نداره بلکه به حافظه کامپیوتر بستگی داره
یعنی ممکنه که تو یه PC فاکتوریل 100000000000000 رو حساب کنه و تو یکی دیگه حتی 100000000 رو حساب نکنه
البته اگه از biginteger استفاده کنی اساتید قبول نمیکنن
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.