long sum

جمع اعداد بزرگ در برنامه نویسی

sum of big number

sum of big number

نوع های عددی موجود در زبان های برنامه نویسی دارای ظرفیت های خاصی هستند و بازه های خاصی از اعداد را در خود می گیرند مثلا اعداد صحیح در بازه ی حدودا ۳۲۰۰ تا -۳۲۰۰ است اگر مقدار بیشتر از این مقدار ها مثالا  ۷۸۸۱۸۲۵ در آن ها قرار بدهیم overflow میکنند یا لبریز می شوند و مقداری اشتباه در آن ها قرار می گیرد.

ما در این جا راه حلی ساده برای جمع اعداد حداکثر ۵۰ رقمی و مثبت آورده ایم، درست است این روش بهترین روش نیست ولی تقریبا راه حل های دیگر از این روش درست می شوند و باید آن را یاد گرفت.

سوال:برنامه ای بنویسید که دو عدد حداکثر ۵۰ رقمی را جمع کند.

وقتی دو عدد صحیح (int) را جمع کنیم حداکثر می توانیم دو عدد ۳۲۷۶۷ را جمع کنیم یعنی دو عدد پنج رقمی
این محدودیت برای سایر انواع هم صدق می کند برای رهایی از این مشکل ما برنامه ای می نوسیم که اعداد را به صورت رشته می خواند و عملیات را روی رشته انجام می دهیم و این کار محدودیت را از بین می برد ولی ما فعلا برنامه را برای جمع دو عدد حداکثر ۵۰ رقمی می نویسیم .

در این برنامه ما دو آرایه ۵۰ رقمی از نوع char داریم که اعداد را برای جمع کردن در آن قرار می دهیم و اعداد را به صورت رشته می خوانیم.و یک آرایه دیگر از نوع char داریم که طول آن ۵۱ رقم است و جواب را در آن قرار می دهیم.دلیل این که این آرایه ۵۱ رقم است این است که اگر ۲ عدد ۵۰ رقمی را جمع کنیم حداکثر ۵۱ رقم می شود.

نحوه کار به این شکل است که که یک کاراکتر از یک آرایه می خواند و یک کاراکتر دیگر هم از آرایه دیگر می خوانیم و کد اسکی کاراکتر ها را منهای ۴۸ می کنیم (منهای ۴۸ می کنیم زیرا کد اسکی کاراکتر ۰ عدد ۴۸ وکد اسکی کاراکتر ۱ عدد ۴۹ است و… )و باهم جمع می کنیم اگر عدد کوچک تر از ۱۰ بود در آرایه جواب قرار می دهیم ولی اگر بزرگ تر یا مساوی ۱۰ بود باقی مانده صحیح آن را بر ۱۰ حساب می کنیم و در آرایه جواب قرار می دهیم و یک واحد به کاراکتر های بعدی هنگام جمع اضافه می کنیم.لطفا برنامه را خودتان بنویسید اگر نشد کد را ببینید.از توضیح جزییات خوداری می کنیم تا کد را خودتان خوب تحلیل کنید و به یادگیریتان کمک شود.

 

۸ دیدگاه

  • سلام.بسیار سپاس گذارم بابت کدی که نوشتین.اما میشه لطفا توضیح بدین در خط۳۱تا۳۴ دقیقا برنامه چیکار میکنه؟

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

      یادش بخیر خیلی وقت پیش اینا رو نوشتم! حتی کد استایل هم رعایت نمی کردم! 🙂

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

  • مسلم درخشان

    very good. thank you.

  • خیلی خیلی خیلی تشکر بابت برنامه ای که در اختیار ما قرار دادید . مطمعنا اجرشو اون دنیا دارید . اجرتون با امام حسین

  • سلام دوستان قبل از هر چیز باید از آقا فرهاد دلیرانی عزیز تشکر کنم به خاطر اینکه به این اندازه با حوصله و کامل برنامه ها رو تشریح کردن وبعد از توضیحات کاملشون ،دوستان رو به نوشتن کد تشویق و دعوت کردن و همچنین وب سایت بسیار زیباشون !!!
    سورس برنامه ۱ ایراد بسیار بسیار کوچیک داره که اون هم به خاطر فراموشی هست ونه چیز دیگری !!!اون هم اینه که تابع ( strlen ) رو که کارش شمارش کاراکتر های ذخیره شده در یک آرایه هست . استفاده شده ولی کتابخانه ای که این تابع در اون تعریف شده (string.h) در سورس تعریف نشده !!!
    حالا شما کافیست که این کتابخانه رو به صورت include# قبل از تابع mainتعریف کنید !!!

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

      سلام تشکر می کنم بابت نظرتان . کد را ران کردم کار کرد بدون مشکل . بیشتر چیز های کتابخانه ی string.h به صورت پراکنده در سایر کتابخانه ها هم هست و اگر اشتباه نکنم باید توی conio.h هم باشد.
      باز مطمین نیستم باید چک کنم.

  • تفاوت بین دستور gets و cin چیه؟

    • خیلی ساده اگه بخوایم مقایسه کنیم میشه گفته با ()gets فقط میشه string ها رو خوند اما با cin میشه مقادیر هر data type دلخواه رو خوند و در داخل متغیر قرار داد.

نظر خود را بنویسید.

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