PDA

View Full Version : سوال: راهنمایی در مورد ساخت برنامه عملیات روی اعداد بزرگ



mas'oud
چهارشنبه 05 خرداد 1389, 14:13 عصر
با سلام
همونطور که میدونید کامپایلر C#‎ فقط تا مقدار خاصی میتواند روی اعداد ، چهار عمل اصلی را انجام دهد (با + ,-,*,/). ولی در مورد اعداد بزرگ مثلا عددی 40 رقمی این کار شدنی نیست و باید با استفاده از آرایه و روشهای دیگر این کار را کرد.
من در حال تهیه ماشین حسابی هستم که یکی از بخشهای آن کار روی اعداد بسیار بزرگ است.


[http://barnamenevis.org/forum/attachment.php?attachmentid=49747&stc=1&d=1274868038


همونطور که در عکس میبینید برنامه دوعدد n1 و n2 را از کاربر گرفته و جواب را در تکست باکس آخر میریزد.
من تقریبا توانستم در کنسول عمل جمع را پیاده سازی کنم ولی نمیدانم در فرم ویندوزی چگونه عبارت تایپ شده در تکست باکس را به آرایه اعداد تبدیل کنم!!
ضمن اینکه آرایه باید دو خانه اضافی یکی برای +،- و دیگری برای ممیز داشته باشد.
لطفا راهنمایی کنید.:متفکر::قلب:

saber187518
چهارشنبه 05 خرداد 1389, 15:54 عصر
با سلام
دوست عزیز شما میتونی تک تک کاراکتر های textbox رو داخل یک آرایه که از قبل تعریف کردی بریزی.
اینم نمونه.(البته اگه درست مشکل رو متوجه شده باشم)

char[] st = new char[100];
for (int i = 0; i < textBox1.TextLength(); i++)
st[i] = textBox1.Text(i);

علیرضا حسن زاده
چهارشنبه 05 خرداد 1389, 16:55 عصر
از این روش هم می تونی استفاده کنی راحت تر هم هست:

char[] st = textBox1.Text.ToCharArray();
اگر داخل یه بدنه تابع هم استفاده کنی به صورت زیر بهتره:

var st = textBox1.Text.ToCharArray();
البته تفاوت چندانی باهم ندارن

r00tkit
چهارشنبه 05 خرداد 1389, 16:55 عصر
با سلام
همونطور که میدونید کامپایلر C#‎‎ فقط تا مقدار خاصی میتواند روی اعداد ، چهار عمل اصلی را انجام دهد


:متفکر::قلب:

سلام
زیاد زحمت نکش

BigInteger (http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx)

مثال:
http://barnamenevis.org/forum/showthread.php?t=219226

mas'oud
چهارشنبه 05 خرداد 1389, 20:40 عصر
خواهشا" یه مثال فارسی بزنید این سایت ماکروسافت برام گنگه.

r00tkit
چهارشنبه 05 خرداد 1389, 22:34 عصر
مثال فارسی یعنی چی؟

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

اینو بخون راحت تر توضیح داده
http://blogs.msdn.com/b/bclteam/archive/2007/01/16/introducing-system-numeric-biginteger-inbar-gazit.aspx

علیرضا حسن زاده
چهارشنبه 05 خرداد 1389, 23:52 عصر
دوست عزیز من فکر کردم شما تو کنسول برنامه رو نوشتی و حالا می خوای از TextBox بگیری ولی اگه روش جمع رو بلد نیستی می تونی هم از BigInteger استفاده کنی البته فکر کنم تو دات نت چهار ارائه شده و اگه از ورژن پایین استفاده می کنی می تونی یه لیست از اعداد Integer استفاده کنی مثلا اگه می خوای دو عدد 256 رقمی رو با هم جمع کنی باید حساب کنی که حداکثر تعداد ارقامی که بعد از جمع می تونه تولید بشه چقدر می تونه باشه برای ضرب و تقسیم هم همین طور اگه از سربارگذاری عملگرهای هم برای کلاس استفاده کنی می تونی دوعدد رو که تو کلاس ذخیره کردی مثل دوتا Integer معمولی جمع کنی
یادش بخیر یه زمانی به عنوان پروژه کلاسی تو دوره کاردانی با زبان ++C نوشته بودم اگه بخوای می تونم همینجا واست Upload کنم تبدیلش به #C هم مشکل نیست

saber187518
پنج شنبه 06 خرداد 1389, 00:16 صبح
با سلام
دوستان عزیز نوع biginteger هم یک حدی داره.
در برنامه نویسی وقتی که اعداد بزرگ رو میخوان در محاسبات دخیل کنن از چندین روش استفاده میکنن.
یکی از روش ها اینه که عدد رو داخل یک رشته بذارید و با اون کار کنید. به این صورت که هر رقم رو به عنوان یکی از خونه های رشته در نظر بگیرید. و محاسباتتون رو روی خونه ها انجام بدید.
که این روش مزیت محاسبه تا هر تعداد رقمی رو داره ولی یک عیب هم داره اینه که محاسبه یکم پیچیده میشه و مشکل دوم اینه که زمان بر میشه.
موفق باشی.

میلاد قاضی پور
پنج شنبه 06 خرداد 1389, 00:28 صبح
برای منم خیلی جالب بود . چطور از آرایه ها برای اینکار استفاده میشه لینکی جهت توضیحات بیشتر میخوام اگه ممکنه .

saber187518
پنج شنبه 06 خرداد 1389, 00:43 صبح
با سلام
دوست عزیز لینک براش ندارم چون خودم روش کار کردم.
نحوه انجام این کار به این صورت هست که مثلا یک عدد 200 رقمی رو میخوای با یک عدد 342 رقمی جمع کنی.(مثلا):لبخند:
برای این کار باید رقم اول رو با رقم اول جمع کنی. البته قبلش باید اونها رو به کد اسکی تبدیل کنی و کد اسکی رو به عدد معادل، حالا جمع کنی و جواب رو به کد اسکی تبدیل کنی و دوباره ذخیره کنی. حالا با فرض اینکه جواب جمع دو رقمی بشه شما باید رقم یکان را ذخیره و به جمع دو رقم بعد یک واحد اضافه کنی(carry).
امیدوارم که گرفته باشی کل کار چطوره.
موفق باشی

mas'oud
پنج شنبه 06 خرداد 1389, 08:50 صبح
از همه دوستان ممنون
باید بگم من از دات نت 3.5 و ویژوال استودیو 2008 استفاده میکنم .احتمالا BigInteger نداره
در ضمن من تا حدودی تونستم عمل جمع رو پیاده سازی کنم ولی یه خورده مشکل داره اونم اینکه:
اولا تعداد ارقام هر دو تکست باکس باید یکی باشه
ثانیا اگر عدد جواب به صفر ختم بشه اونو نشون نمیده!!!! یعنی صفرش رو نشون نمیده
ثالثا فقط با اعداد صحیح کار میکنه و اعداد اعشاری رو ساپورت نمیکنه

دمتون گرم کمک کنید با یاری هم این برنامه رو به سرانجام برسونیم.:لبخند:
اینم نمونه برنامه:

saber187518
پنج شنبه 06 خرداد 1389, 11:40 صبح
با سلام
دوست عزیز برنامه نیاز نیست که حتما دو عدد رو با طول مساوی بگیره.
هم عدد اول امکان داره بزرگتر از عدد دوم باشه و هم عدد دوم ممکنه بزرگتر از اولی باشه و هم ممکنه هر دو برابر باشند.
شما باید تمامی این حالت ها رو پیاده سازی کنی.
البته کمکت میکنم.
الان کار دارم ولی احتمالا تا ساعت 14 برات بذارمش.
موفق باشی.

saber187518
پنج شنبه 06 خرداد 1389, 15:49 عصر
با سلام
ببخشید دیر شد کارم جایی گیر بود.
این برنامه میتونه اعداد رو فقط جمع کنه تا 100 رقم حداکثر.

r00tkit
پنج شنبه 06 خرداد 1389, 20:43 عصر
با سلام
دوستان عزیز نوع biginteger هم یک حدی داره.
در برنامه نویسی وقتی که اعداد بزرگ رو میخوان در محاسبات دخیل کنن از چندین روش استفاده میکنن.
یکی از روش ها اینه که عدد رو داخل یک رشته بذارید و با اون کار کنید. به این صورت که هر رقم رو به عنوان یکی از خونه های رشته در نظر بگیرید. و محاسباتتون رو روی خونه ها انجام بدید.
که این روش مزیت محاسبه تا هر تعداد رقمی رو داره ولی یک عیب هم داره اینه که محاسبه یکم پیچیده میشه و مشکل دوم اینه که زمان بر میشه.
موفق باشی.

دوست عزیز بهتره کمی بیشتر توجه کنی:
از لینک بالا:



The BigInteger type is an immutable type that represents an arbitrarily large integer whose value in theory has no upper or lower bound
اینم بخون



basically, a BigInteger is an abstraction of an array of integer values together with a sign, with overloads for typical integer operators

حرف زیاده ولی یه سری شو می گم:عصبانی++:
دوست من من این روش رو تو c نوشته بودم این روش نیاز به حلقه های طولانی داره درست هستش؟ پی فرض کن عدد ما خیلی خیلی بزرگ هستش پس حلقه هم زیاد می شه و توی هر حلقه می خوای string گی رو که immutable تغییر بدی؟

شما در این روش باید بیای همه +-/* رو پیاده سازی کنه :گیج::گیج:

وقت برنامه نویس خیلی مهم تر از وقت سیستم هستش(که شما بیای این همه وقت صرف کنی )

پی نوشت:
می شه از BigInteger در vs2008 هم استفاده کرد

و اگه زبان مهم نسیت می تونی از python استفاده کنی

mas'oud
پنج شنبه 06 خرداد 1389, 20:57 عصر
با سلام
ببخشید دیر شد کارم جایی گیر بود.
این برنامه میتونه اعداد رو فقط جمع کنه تا 100 رقم حداکثر.


شرمنده
شما هم افتادی تو زحمت
من باید معذرت خواهی کنم دوست عزیز!!

بابت برنامه خیلی خیلی ممنون، راهنمایی بسیار بزرگیه، انشاالله بتونم بقیشو خودم بنویسم.
__________________________________________
در جواب دوست بالایی (geek1982) :

مگه نوع داده BigInteger برای اولین بار همراه دات نت 4 ارائه نشده؟
پس چجوری vs2008 اونو ساپورت میکنه؟
آیا راهی برای ارتقای vs2008.net 3.5 به .net 4 وجود داره؟

r00tkit
پنج شنبه 06 خرداد 1389, 23:19 عصر
در جواب دوست بالایی (geek1982) :

مگه نوع داده BigInteger برای اولین بار همراه دات نت 4 ارائه نشده؟
پس چجوری vs2008 اونو ساپورت میکنه؟
آیا راهی برای ارتقای vs2008.net 3.5 به .net 4 وجود داره؟


_

سلام
نخیر توی 3.5 معرفی شده
http://bartdesmet.net/blogs/bart/archive/2007/02/24/system-numeric-biginteger.aspx

فایل system.core.dll رو برات قرار دادم ورژن 3.5 هستش

amir-yeketaz
جمعه 07 خرداد 1389, 00:18 صبح
اگه میخوای خوب تو این بحث استاد بشی برو فاکتوریل اعداد بزرگ رو پیاده سازی کن (یادش بخیر ترم اول جز تمرینامون! بود !!! ) که حسابی محک بخوری :لبخند:
باید برای فاکتوریل ابتدا از ضرب سنتی که در دوران ابتدایی انجام میدادی استفاده کنی و بعد اون عدد به دست اومده رو با فاکتوریل دو عدد قبلی جمع کنی و جمع اعدا بزرگ رو هم استفاده کنی...
توضیح بیشتر :
فرض کن میخوایم 100 فاکتوریل رو حساب کنیم :
میایم میگیم 100 * 99 ، حالا برای اینکار مثه دوران ابتدایی اول میایم میگیم عدد یکان 99 یعنی 9 در عدد یکان 100 یعنی صفر ضرب میشه و یه عدد میره تو آرایه و همین جوری ... دیگه چجوری دو تا عدد خفنو اگه ماشین حساب نداشته باشی ضرب میکنی همین جوری دیگه ! بعد این عدد به دست اومده یعنی 9900 رو تو ارایه نگه میداری و بعد میای 98 رو در 9900 ضرب میکنی و دوباره عددی که بدست میاد رو با 97 ضرب میکنی و همین جوری میری جلو ...
فقط باید اول رقم ها رو با اون الگوریتم معروف جدا کنی و بریزی تو یه آرایه یعنی اول 100 و 99 رو رقماشو جدا میکنی و میریزی تو دو تا آرایه و بعد یه sum ای به دست میاد (که دیگه خودش آرایه ای هستو و عدداش جدا و اونو با 98 و همین طوری جلو میری و به نسبت طول آرایت میتونی اعدا بزرگتری رو فاکتوریل کنی!
درسته یه خورده شاید سخت باشه ولی واسه من حل کردنش خیلی فاز داد !!
امیدوارم فهمیده باشی چی گفتم ...
موفق باشید

uniservice
جمعه 07 خرداد 1389, 00:35 صبح
دوست عزیز سما می تونید با استفاده از آرایه های کاراکتری اعداد رو بگیری و سپس عملیات ریاضی رو روشون انجام بدی من این برنامه رو فبلا در pascal نوشتم زیاد هم سخت نیست برای راهنمایی بیشتر بیا به سایت من www.tprogrammer.com و در انجمن جوابتو بگیر.

saber187518
جمعه 07 خرداد 1389, 00:41 صبح
با سلام
دوست عزیز geek1982 آیا biginteger میتونه فاکتوریل 1000 رو محاسبه کنه؟
اگه میتونه لطف کن برنامه شو برام بنویس و بذار.
البته بگم من این برنامه رو نوشتم فقط میخوام ببینم آیا واقعا biginteger که این همه ازش تعریف میشه کارایی اینقدر بالا رو داره یا مثلا فاکتوریل یک عدد 100 رقمی رو میتونه محاسبه کنه؟
چون طبق نوشته دوست عزیزمون این نوع داده ای حد بالا و پایین نداره...
آها راستی یادم رفت بگم که در متن نوشته بود که این فرضیه نامحدودی در تئوری مطرح هست.
من منتظرم.

mas'oud
جمعه 07 خرداد 1389, 15:15 عصر
با سلام
ببخشید دیر شد کارم جایی گیر بود.
این برنامه میتونه اعداد رو فقط جمع کنه تا 100 رقم حداکثر.


برنامتون ایراد کوچیک داشت!!

عدد منفی با مثبت رو جمع نمیکنه (یعنی جواب بی ربط میده)
اعداد اعشاری هم مثل اینکه ... حل نمیکنه:متفکر::عصبانی++:
ولی دستت درد نکنه:خجالت:

sadeghahmadi67
چهارشنبه 28 دی 1390, 21:43 عصر
سلام . از دوستان اگر کسی این برنامه را کامل دارد می تونه در اختیار من بزاره؟
sadegh.ahmadi859@gmail.com
فوری

mahan.2002
چهارشنبه 28 دی 1390, 22:36 عصر
من محاسبه فاکتوریل اعداد بزرگ رو با آرایه ها نوشتم البته با C اگر میبینی بدرد میخوره بگردم پیدا کنم انشاا... بتونم براتون بزارم..
فکر میکنم میتونی از این ایده استفاده کنی...:لبخندساده:

sadeghahmadi67
چهارشنبه 28 دی 1390, 22:40 عصر
سلام . نه دوست عزیز حتما باید سی شارپ باشه و 4 عمل اصلی :گریه: