نمایش نتایج 1 تا 5 از 5

نام تاپیک: جمع و تفریق دو عدد خیلی بزرگ (تعداد ارقام دلخواه)

  1. #1
    کاربر دائمی آواتار baran_mehr
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    شهر آفتاب گرمسار
    پست
    1,129

    Post جمع و تفریق دو عدد خیلی بزرگ (تعداد ارقام دلخواه)

    در این پست قصد دارم دوتا برنامه که برای جمع و تفریق دو عدد خیلی بزرگ هست رو قرار بدم و مختصری توضیح
    این برنامه رو خودم نوشتم و از الگوریتم خاصی استفاده نکردم فقط هدفم انجام این کار بود
    دو عدد را از دو فایل خوانده و این اعمال را بر روی آن انجام خواهد داد
    فرض کنید این دو فایل با نام 1 و 2 از نوع Txt و در درایو C قرار دارند و دو عدد خود را درون آنها نگهداری کرده ایم.
    c:\1.txt and c:\2.txt

  2. #2
    کاربر دائمی آواتار baran_mehr
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    شهر آفتاب گرمسار
    پست
    1,129

    نقل قول: جمع و تفریق دو عدد خیلی بزرگ (تعداد ارقام دلخواه)

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

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


    شرح خطوط:
    سه ارایه با نامهای num1 و num2 و pهمگی از نوع int و 5000 خانه ای تعریف کرده ایم.
    آرایه num1 برای خواندن عدد از فایل 1.txt می باشد و قرار است مقادیر این فایل را در خود نگهداری کند.
    آرایه num2 برای خواندن عدد از فایل 2.txt می باشد و قرار است مقادیر این فایل را در خود نگهداری کند.
    ارایه p برای ذخیره کردن مجموع اعداد دو ارایه دیگر است.
    int num1[5000];
    int num2[5000];



    //-------------------------------file1
    int num1[5000];
    cout<<"Number one :";
    ifstream fp1("c:\\1.txt");
    while(!fp1.eof()) {
    ch=fp1.get();
    if((int)ch==48) num1[i]=0; if((int)ch==49) num1[i]=1;
    if((int)ch==50) num1[i]=2; if((int)ch==51) num1[i]=3;
    if((int)ch==52) num1[i]=4; if((int)ch==53) num1[i]=5;
    if((int)ch==54) num1[i]=6; if((int)ch==55) num1[i]=7;
    if((int)ch==56) num1[i]=8; if((int)ch==57) num1[i]=9;
    cout<<ch;
    i++;
    }
    n1=i-1;
    fp1.close();


    شرح دستورات فوق:
    ifstream fp1("c:\\1.txt")

    در اینجا ما بعد از باز کردن فایل شروع به خواندن مقادیر درون فایل میکنیم تا رسیدن به اخرین کاراکتر فایل، این کار را با حلقه While انجام میدهیم و شرط اتمام حلقه را رسیدن به انتهای فایل میگذاریم.
    کاراکتر به کاراکتر را از فایل خاج میکنیم.
    بدلیل اینکه کاراکترها باید به عدد تبدیل شوند و درون آرایه قرار گیرند. اول کد اسکی انها را بدست آورده (int)ch و سپس مشخص میکنیم این کد اسکی برابر با کدام عدد می باشد.
    به عنوان مثال کد اسکی عدد صفر برابر با 48 است و کد اسکی عدد یک برابر با 49 ....
    و پس از تبدیل هر عدد آن را برای نمایش در مانیتور چاپ میکنیم cout<<ch
    برای بدست اوردن طول ارایه یا به عبارتی طول عدد از متغیر i استفاده کرده ایم یه این صورت که پس از هر بار تبدیل کاراکتر به عدد یک واحد به i اضافه می کنیم و در نهایت طول رشته یا همان عدد تبدیل شده را در i خواهیم داشت. در اخر طول ارایه را در متغیر n1 میریزیم
    در اخر هم فایل باز کرده را میبندیم fp1.close


    //-------------------------------file2
    ch='0'; i=0;
    int num2[5000];
    cout<<endl<<"Number two :";
    ifstream fp2("c:\\2.txt");
    while(!fp2.eof()) {
    ch=fp2.get();
    if((int)ch==48) num2[i]=0; if((int)ch==49) num2[i]=1;
    if((int)ch==50) num2[i]=2; if((int)ch==51) num2[i]=3;
    if((int)ch==52) num2[i]=4; if((int)ch==53) num2[i]=5;
    if((int)ch==54) num2[i]=6; if((int)ch==55) num2[i]=7;
    if((int)ch==56) num2[i]=8; if((int)ch==57) num2[i]=9;
    cout<<ch;
    i++;
    }
    n2=i-1;
    fp2.close();

    دستورات فوق نیز همانند دستورات مرحله قبل میباشند با این تفاوت که این بار اعداد از فایل 2.txt خوانده شده و در Num2 نگهداری میشوند. طول این عدد در متغیر n2 نگهداری میشود.



    //------------------------------------
    int c=0;
    int max,b1=0,b2=0,a=0;
    int p[5000];

    if (n1>n2) {max=n1;} else {max=n2;}
    if((num1[max]+num2[max])>9){c=1;}
    for (i=0;i<max+1;i++)

    حال نوبت به جمع دو عدد موجود در ارایه ها می رسد.
    توجه داشته باشید که در جمع ممکن است نتیجه جمع دو عدد بیشتر از 9 و دو رقمی شود .پس میبایست سر ریز جمع دو عدد را بر روی عدد بعدی تاثیر بگذاریم.
    فرض کنید دو عدد 8 و 5 را بخواهید با هم جمع کنید نتیجه 13 خواهد شد و ما باید 3 را چاپ کرده و ده بر یک ان را بع عدد بعدی بدهیم و چون عدد بعدی وجود ندارد باید ده بر یک را چاپ کنیم که در نهایت 13 خواهد شد.
    متغییر c را برای نگهداری سر ریز تعریف کرده ایم
    و متغییر max را برای نگهداری طول ارایه بزرگتر تعریف کردیم یه این صورت که n1 و n2 که طول ارایه اول و دوم هست را با هم مقایسه میکنیم و هرکدام که بزرگتر بود آنرا درون max میریزیم.
    حال متغییر های b1 و b2 برای نگهداری موقت خانه های دو ارایه استفاده میشود.
    متغییر a برای نگهداری جمع دو ععد به کار برده شده است.

     {if((num1[max]+num2[max])>9){c=1

    در این دستور چک میکنیم که اخرین خانه ارایه اول با اخرین خانه ارایه دوم جمع شود و اگر سرریز داشت یعنی جمع دو عدد 2 رقمی میشود متغییر سر ریز یعنی c را برابر با یک میکنیم(یعنی سرریز وجود دارد)
    حلقه for هم برای خواندن خانه های ارایه از اول تا اخر میباشد و تا رسیدن به طول ارایه بزرگتر در حال چرخش است

    b1=num1[n1-i];
    b2=num2[n2-i];

    if(n1<i) {b1=0;}
    if(n2<i) {b2=0;}

    a=b1+b2;

    if (c==1) { a++; c=0;}
    if (a<10)
    {
    p[max-i]=a;
    }
    else
    { p[max-i]=a-10;
    c=1;
    }

    در هر بار چرخش حلقه for اعداد ارایه ها به متغییر های کمکی b1 و b2 داده میشود تا بر روی انها محاسبات انجام شود.
    از دو دستور if یه این خاطر استفاده میکنیم. چون در صورتی که طول یکی از اعداد کمتر از عدد دوم باشد یعنی مثلا عدد اول 3000 رقمی باشد و عدد دوم 3500 رقمی در این صورت 500 رقم اضافه عدد دوم مستقیما و بدون محاسبات خاصی چاپ میشود.123456 را با 12 جمع کنید خواهید دید که اعداد 1234 بدون تغییر چاپ میشوند و جواب میشود 123468
    بعد از جمع دو عدد، برسی میشود که ایا سرریز وجود د اشته یا نه؟
    اگر سر ریز وجود نداشته باشد جواب چاپ خواهد شد و در غیر این صورت باید سر ریز را با جواب جمع کنیم.
    نتیجه هر جمع را درون ارایه p میریزیم
    و به همین ترتیب تا انتهای ارایه ها را چاپ خواهیم کرد.

    cout<<endl<<"Result Add :";
    if (a>=10) {cout<<1;}
    for(i=0;i<max;i++)
    cout<<p[i];
    getch();

    در نهایت ارایه p یا همان ارایه نتیجه را از اول تا اخر چاپ میکنیم

  3. #3
    کاربر دائمی آواتار baran_mehr
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    شهر آفتاب گرمسار
    پست
    1,129

    نقل قول: جمع و تفریق دو عدد خیلی بزرگ (تعداد ارقام دلخواه)

    این هم سورس برنامه جمع دو عدد بزرگ
    فایل های ضمیمه فایل های ضمیمه
    • نوع فایل: rar add.rar‏ (16.5 کیلوبایت, 391 دیدار)

  4. #4
    کاربر دائمی آواتار baran_mehr
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    شهر آفتاب گرمسار
    پست
    1,129

    نقل قول: جمع و تفریق دو عدد خیلی بزرگ (تعداد ارقام دلخواه)

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

    //------------------------------------
    int b1=0,b2=0,a=0;
    int p[5000]; p[0]=0;
    // if((num1[max]-num2[max])>9){c=1;}
    for (i=1;i<=max;i++)
    { n:
    if (num1[max-i] >= num2[max-i])
    { p[max-i]=num1[max-i]-num2[max-i]; }
    else if (num1[max-i-1]>0)
    {
    num1[max-i-1]-=1;
    num1[max-i]+=10;
    goto n;
    }
    else if (num1[max-i-2]>0)
    { num1[max-i-2]-=1;
    num1[max-i-1]+=9;
    num1[max-i]+=10;
    goto n;
    }
    else if (num1[max-i-3]>0)
    { num1[max-i-3]-=1;
    num1[max-i-2]+=9;
    num1[max-i-1]+=9;
    num1[max-i]+=10;
    goto n;
    }
    else if (num1[max-i-4]>0)
    { num1[max-i-4]-=1;
    num1[max-i-3]+=9;
    num1[max-i-2]+=9;
    num1[max-i-1]+=9;
    num1[max-i]+=10;
    goto n;
    }
    else if (num1[max-i-5]>0)
    { num1[max-i-5]-=1;
    num1[max-i-4]+=9;
    num1[max-i-3]+=9;
    num1[max-i-2]+=9;
    num1[max-i-1]+=9;
    num1[max-i]+=10;
    goto n;
    }
    }
    cout<<endl<<"Result Add :";
    for(i=0;i<max;i++)
    cout<<p[i];
    getch();}

    در اینجا ما دیگر سر ریز نخواهیم داشت .چون دو عدد از هم کسر میشوند.
    به جای سرریز ممکنم است نیاز به قرض کردن عدد از عدد قبلی شویم. فرض کنید بخواهیم 16 را بر 8 تفریق کنیم. در اینجا چون 6 از 8 کوچکتر است نیاز به ان داریم تا از عدد قبلی قرض بگیریم
    به این صورت که از عدد قبلی یکی کم کرده و به عدد موجود 10 واحد اضافه میکنیم(انجام مراحل عمل تفریق)

    ما در برنامه برسی می کنیم که اگر عدد اول از عدد دوم بزرگتر باشد عمل تفریق بدون شرط خاصی صورت میگیرد.
    اما در صورتی که عدد اول از عدد دوم کوچکتر باشد از عدد قبلی یکی کم میکنیم و به عدد موجود 10 تا اضافه تا بتوانیم تفریق را انجام دهیم
    حال ممکن است عدد قبلی صفر باشد؟؟ در این صورت از دوعدد قب تر قرض گرفته و به عدد قبلی یعنب صفر 9 واحد اضافه میکنیم و به عدد موجود 10 واحد و عمل تفریق را انجام میدهیم
    مراحل قرض گیری را تا 5 برار میتوانیم انجام دهیم و اگر بخواهیم تعداد ان را زیادتر کنیم نیازبه نوشتن کد بیشتری داریم
    پس از هر بار قرض گرفتن، برای محاصبه مجدد تفریق(چون عددمان بزرگتر شده و میشود تفریق را انجام داد) با دستور Goto n به نقطه n پرش میکنیم.یعنی جایی که تفریق انجام میشود.
    و زمانی که تفریق صورت گرفت جواب را به ارایه p میریزیم
    و در نهایت کل ارایه p را چاپ میکنیم.

  5. #5
    کاربر دائمی آواتار baran_mehr
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    شهر آفتاب گرمسار
    پست
    1,129

    نقل قول: جمع و تفریق دو عدد خیلی بزرگ (تعداد ارقام دلخواه)

    اینم سورس برنامه تفریق
    فایل های ضمیمه فایل های ضمیمه

قوانین ایجاد تاپیک در تالار

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