کار با اعداد بزرگ و طولانی -جمع ، ضرب ، توان

جمع ضرب و توان اعداد بزرگ و سنگین و طولانی 1

خیلی از وقت ها وقتی می خواهیم برنامه ای بنویسیم احتیاج داریم با اعداد خیلی بزرگ و سنگین کار کنیم که  از  محدوده ی نوع های  زبان برنامه نویسیمون خارج است حتی در محدوده double هم قرار نمی گیره .اون موقع است که برناممون دچار  مشکل می شه  و متغییر هامون سرریز می کنند .

برای حل این مشکل معمولا برنامه نویسان کلاس ها و تابع هایی را  می نویسند البته بعضی زبان های برنامه نویسی امکانات خوبی در اختیار می گذارند مانند پایتون که می شه  باه راحتی با اعداد خیلی بزرگ کار کرد من قبلا در پستی هایی جداگانه  “پروژه ماشین حساب با عملیات روی اعداد ۱۰۰۰ رقمی با c” و “الگوریتم تقسیم اعداد بزرگ(۵۰ digit divition)” به این مشکل ها پرداخته بودم ولی اون برنامه ها زیاد سریع نبودن و برای اعداد ۱۰۰۰ رقمی بودن  و محدودیت اعداد داشتند.

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

ورودی و خروجی این توابع رشته است زیرا کار با آن ها خیلی راحت است و می توان رشته ای خیلی طولانی داشت ولی خود رشته ها هم محدودیت طول دارند دقیق یادم نیست ولی فکر کنم طولشون از ۲ میلیون هم بیشتر بشه  ولی برای این مشکل می تونید از روش هایی دیگه استفاده کنید.

من  تابعی به اسم   Tipper  نوشتم که که عدد را برعکس می کنه  ولی عملیات های ریاضی  به همون شکل عادی صورت می گیرد  برای این این کار را کردم که کار با اعداد راحت تر شود و اگر خواستم  رقمی به یک رشته اضافه کنم به تونم به راحتی از تابع push_back  استفاده کنم  مخصوصا وقتی که هنگام ضرب باید صفر هایی جلوی اعدا د گذاشت.

 

 

تابع بعدی تابع جمع sum است  که  برای اعداد صحیح بزرگ تر مساوی صفر است

 

 

تابع بعدی تابع ضرب  multiplication است این تابع دقیقا  مثل ضرب کردن اعداد توسط خودمون عمل می کند و در آن از تابع جمع  sum  استفاده شده است  ، ورودی این تابع اعداد  دو رشته است و خروجی اش  هم به صورت رشته است:

 

 

این تابع هم تابع توان  power است که در آن از تابع ضرب استفاده شده است ورودی اول که رشته  است پایه توان است  و عدد بعدی که از نوع int  است عددی است که پایه باید به توان آن برسد:

 

 

اینم کد کلی برنامه  که برای مثال در آن ۲ به توان ۱۰۰۰  را حساب می کند  :

 

 

اینم حاصل ۲ به توان ۱۰۰۰  :

 جمع ضرب و توان اعداد بزرگ و سنگین و طولانی

امیدوارم از حل این سوال لذت برده باشید اگر راهی داشتید یا برنامه ای  برای  این سوال نوشته اید حتما آن را برای ما ایمیل کنید یا در نظرات بنویسید ، کد شما در همین صفحه قرار خواهد گرفت با تشکر فراوان از این که ما را دنبال می کنید.

 

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

۲۴ دیدگاه

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *