تبلیغات


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

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

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

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

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

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

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

 

 

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

 

 

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

 

 

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

 

 

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

 

 

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

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

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

 


تبلیغات:

۳۱ نظر

  • با عرض سلام و خسته نباشیدو تشکر بابت سایت عالیتون.

  • سلام و خسته نباشید. این برنامه با کلاس پیاده سازی شده؟

    • حامد آهنگری

      سلام
      خیر. اما خودتون می تونید با کمی تغییر و استفاده از توابع تعریف شده، کلاس مورد نظرتون رو بسازید

  • سلام وقتتون بخیر اقای دلیرانی میخواستم راجب برج هانوی توضیح بدین و بگین چطور برنامه بنویسم براش بصورت گرافیکی نمایش بدیم بی زحمت در ضمن سایت بسیار خوب و مفیدی دارید ممنونم ازتون

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

    • حامد آهنگری

      سلام.
      با توجه به جزییات پروژه استادتون، باید با استفاده آرایه ای از int ها رقم های اعداد بزرگ رو نگه داری کنید (هر رقم در یک خانه از آرایه قرار می گیرد). در کد ارائه شده در این مطلب، از آرایه کاراکترها (رشته) برای نگه داری هر رقم استفاده شده است (هر رقم به عنوان یک کاراکتر در آرایه ذخیره شده).
      موفق باشید

  • واقعا عالی بود

  • سایتتون فوق العاده ست. ممنون بابت زحماتتون

  • با سلام
    آیا نمی شود در برنامه از رشته ها استفاده نکرد ؟
    یعنی به جای Num1.size از کاربر طول عدد را بپرسیم ؟
    یا اگر کاربر به جای رشته ها از آرایه ها استفاده کنیم هزینه برنامه کاهش می یابد یا افزایش ؟؟

    • فرهاد دلیرانی

      هر کاراکتر یک بایت است در نتیجه یک آرایه ی ۵ تایی از کاراکتر ها ۵ بایت می شود
      در حالی که int در حالت عادی ۴ بایت است در نتیجه یک آرایه ۵ تا از آن ها می شود ۲۰ بایت

  • سلام
    میتونید یه برنامه برای ضرب دو عدد ۵۰ رقمی بنویسید.
    اگر تونستید بنویسید بهم میل بزنید
    ممنون

  • بسیار بسیار ممنون و خسته نباشید : )

  • سایتت خیلی عالیه .مرسی…
    فقط یه سوال.
    میشه راهنماییم کنی جمع وتفریق ۲ عدد بزرگ که ممکنه منفی باشن چطوریه؟(برنامه نویسی c)

    • فرهاد دلیرانی

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

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

  • سلام

    من دانشجوی کامپیوتر هستم، استاد درس ساختمان داده همین رو به عنوان پروژه به ما گفته، ضرب دو عدد ۲۰ رقمی با استفاده از لیست های پیوندی. اگه امکانش باشه من رو راهنمایی کنید. استاد گفته اول اعداد رو شش رقم شش رقم بشکنیم و داخل لیست پیوندی قرار بدیم، بعد ضرب کنیم، اگه راهنماییم کنید ممنون میشم.

  • دستت درد نکنه، یه دو هفته رو این سوال کار کردم، بعدش بی خیال شدم، تا این که این پست رو خوندم. ممنون

  • عدد ها باید به صورت رشته ای وارد بشن ؟ واسه جمع و تفریق میگم .
    #include “stdafx.h” واسه چیه ؟

    • فرهاد دلیرانی

      مهرنوش @ include “stdafx.h #” یک کتاب خانه است است که کامپایلر ویژوال استدیو به آن نیاز دارد . ولی کامپایلر هایی مثل مثل کد بلاک به آن نیاز ندارند.
      بله باید به صورت رشته وارد شوند البته این برنامه فقط جمع دارد برای منها می توانید به این پست مراجعه کنید

      http://open-mind.ir/?p=87

      • misheh begin t , r , ch , mult vaseh chiyan ? r hamoun carry ye ? ch ham yeh temp vaseh negahdashtan meghdare zarb gaei k anjam misheh ? mult ham k akherin meghdare zarb ro negah midareh , dorosteh ? t vaseh chiyeh ?

  • اگه تفریق و تقسیمش هم بذاری و تبدیل به کلاسش کنی خوب می شود

نظرتان را برای ما بنویسید

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