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

نام تاپیک: ضرب اعداد بزرگ

  1. #1
    کاربر دائمی آواتار aidinwashere
    تاریخ عضویت
    فروردین 1384
    محل زندگی
    پشته سرت
    پست
    632

    ضرب اعداد بزرگ

    کسی الگوریتمی براش بلده؟ حالا یا dynamic یا هرچی
    به هر زبانی فقط بایذ دو عدد مثلا 20 رقمی رو بتونه در هم ضرب کنه.

  2. #2
    سلام
    دو عدد Ab و Cd رو در نظر بگیرید اگر این دو رقم را به یکدیگر ضرب کنیم رقم یکان D*b خواهد بود و رقم دهگان (c*b) + (a*d) خواهد بود و رقم صدگان نیز C*a است ( مانده بر ده باید محاسبه شود)

    ارقام بزرگ تر نیز از همین قانون تبعیت می کنند برای مثال Abc * Def که ارقام آن از چپ به راست به ترتیب زیر خواهند بود
    C*f
    B*f + E*c
    A*f + B*e + C*d
    A*e + B*d
    A*d


    امیدوارم جوابتو گرفته باشی. در غیر اینصورت یه Pm بهم بده

  3. #3

    Wink

    const
    MaxDigits=100;
    type
    TDigit=byte;
    TBigNum:array [1..MaxDigits] of TDigit;

    .
    .
    .
    .
    .

    function mul(Num1,Num2:TBigNum;var Ans:TBigNum):TDigit;
    var
    OverFlow:TDigit;
    i,C:integer;
    begin
    C:=0;
    for i:=1 to MaxDigits do begin
    C:=Num1[i]*Num2[i]+OverFlow;
    Ans[i]:=(C mod 10);
    OverFlow:=C div 10;
    end;

    Result:=OverFlow;
    end;

  4. #4
    نقل قول نوشته شده توسط aidinwashere
    کسی الگوریتمی براش بلده؟ حالا یا dynamic یا هرچی
    به هر زبانی فقط بایذ دو عدد مثلا 20 رقمی رو بتونه در هم ضرب کنه.
    من یه راهنماییت میکنم. امیدوارم مفید باشه.

    هر عدد رو تو یه آرایه بریز. (هر رقم در یک خونه)
    بعد مثل ضرب معمولی هر رقم عدد دوم رو در کل ارقام عدد اول ضرب کن و حاصل رو توی یک آرایه سوم بریز. و در هر مرحله محتویات قبلی هر خونه رو با حاصل ضربها جمع کن.
    ده بر یکها یادت نره.

  5. #5
    سلام
    من یه الگوریتم خودم طراحی کردم که میتوان دو عدد نامحدود را هم باهم ضرب یا منها و یا جمع کرد
    این اعداد میتوانند 100 یا 200 یا هر چند رقمی باشند فقط هر چه عدد بزرگتر باشد محاسبه بیشتر طول میکشد البته برنامه آن را هم با زبان پاسکال نوشته ام اگر می خواهید برایتان ارسال نمایم

  6. #6
    سلام

    //verylong.h

    const int SZ =200 ; //maximum digits

    class verylong
    {
    private:
    string vlstr;
    int vlen;
    verylong multdigit(const int)const;
    verylong mult10(const verylong) const;
    public :
    verylong() : vlen(0)
    { }
    verylong(string& const s) : vlstr(s) , vlen(s.lenght())
    { }
    verylong (const unsigned long n)
    {
    char temp[SZ];
    ltoa(n,temp,10);
    strrev(temp);
    vlstr=temp;
    vlen=vlstr.lenght();
    }
    verylong operator *(const verylong)const;
    };

    //************************************************** ****************
    //verylong.cpp

    #include “verylong.h”

    verylong verylong::operator *(const verylong v) const
    {
    verylong pprod;
    verylong tempsum;
    for(int j=0;j<v.vlen;j++)
    {
    int digit=v.vlstr[j] – ‘0’;
    pprod=multdigit(digit);
    for(int k=0;k<j;k++)
    pprod=mult10(pprod);
    tempsum=tempsum+pprod;
    }
    return tempsum;

    }

    verylong verylong::mult10(const verylong v) const
    {
    char temp[SZ];
    for(int j=v.vlen-1;j>=0;j--)
    temp[j+1]=v.vlstr[j];
    temp[0]=’0’;
    temp[v.vlen+1]=’\0’;
    return verylong(temp);

    }

    verylong verylong::multdigit(const int d2) const
    {
    int j;
    char temp[SZ];
    int carry=0;
    for(j=0;j<vlen;j++)
    {
    int d1=vlstr[j]-‘0’;
    int digitprod=d1 * d2;
    digitprod += carry;
    if(digitprod >= 10)
    {
    carry=digitprod/10;
    digitprod-=carry*10;
    }
    else
    carry=0;
    temp[j]=digitprod+’0’;
    }
    if(carry != 0)
    temp[j++]=carry + ‘0’;
    temp[j]=’\0’;
    return verylong(temp);


    }


    override کردن بقیه عملگرها با خودت.
    آخرین ویرایش به وسیله mr_esmaily : چهارشنبه 30 شهریور 1384 در 01:24 صبح

  7. #7
    سلام
    متاسفانه تگ کد , کد مربوطه رو , بصورت بالا نمایش میده.
    فایل های ضمیمه فایل های ضمیمه

  8. #8
    کاربر دائمی آواتار manager
    تاریخ عضویت
    شهریور 1384
    محل زندگی
    Z
    سن
    38
    پست
    771

    Exclamation

    الگوریتمی هست که احتمالا کسائی که با استاد خرسند درس طراحی الگوریتم داشته باشند با هاش برخورد کردند این الگوریتم به نام a la russe هست و دارای زمان مصرفی mn (برای اعداد بزرگ) هست :
    procedure russe(m,n)
    X[1] <- m
    Y[1] <- n
    i <- 1
    while X[i]>1 do
    X[i+1] <- X[i] div 2
    Y[i+1] <- Y[i] + Y[i]
    i <- i + 1
    end
    total <- 0
    while i>0 do
    if X[i] is odd then
    total <- Y[i] + total
    i <- i - 1
    end
    return total
    end

    برای حل این مسئله راه حل های بسیار زیادی وجود داره که این بهترنشون نیست //

  9. #9

    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    main()
    {
    clrscr();
    int a[20],b[20],c[21],i,j,d;
    char x,y;
    i=0;
    j=0;
    d=0;
    printf("enter first number ");
    while(i<20)
    {
    x=getch();
    a[i]=x-48;
    printf("%d ",a[i]);
    i++;
    }
    printf("\n\n\n");
    printf("enter secound number ");
    while(j<20)
    {
    y=getch();
    b[j]=y-48;
    printf("%d ",b[j]);
    j++;
    }
    for(i=19;i>=0;i--)
    {
    c[i]=(a[i]+b[i]+d)%10;
    d=(a[i]+b[i])/10;
    }
    printf("\n\n\n");
    printf(" the sum of numbers is ");
    if((a[0]+b[0])>9)
    {
    printf("%d ",(a[0]+b[0])/10);
    }
    for(i=0;i<20;i++)
    {
    printf("%d ",c[i]);
    }
    getch();
    }
    آخرین ویرایش به وسیله whitehat : پنج شنبه 09 آبان 1387 در 21:22 عصر

  10. #10

    Talking نقل قول: ضرب اعداد بزرگ

    نقل قول نوشته شده توسط alirezah مشاهده تاپیک
    سلام
    من یه الگوریتم خودم طراحی کردم که میتوان دو عدد نامحدود را هم باهم ضرب یا منها و یا جمع کرد
    این اعداد میتوانند 100 یا 200 یا هر چند رقمی باشند فقط هر چه عدد بزرگتر باشد محاسبه بیشتر طول میکشد البته برنامه آن را هم با زبان پاسکال نوشته ام اگر می خواهید برایتان ارسال نمایم

    سلام به شما

    مي خواستم بدونم امكانش هست اين برنامه رو داشته باشم . ممنون مي شم اگه لطف كنين

  11. #11
    کاربر دائمی آواتار Reza,M
    تاریخ عضویت
    تیر 1389
    محل زندگی
    ايران سراي من است
    پست
    412

    نقل قول: ضرب اعداد بزرگ

    با سلام
    آيا از دوستان كسي ميتونه بهترين حالت Thershold (آستانه) را براي اين الگوريتم بدست بياره ؟

  12. #12

    نقل قول: ضرب اعداد بزرگ

    چطور mn میشه پیچیدگیش؟

  13. #13

    نقل قول: ضرب اعداد بزرگ

    منم یه ایده دارم
    اگر بجای مبنای 10 مبنا رو روی 100 یا حتی 10000 بذاریم چی؟ البته نه اینکه مثل مبنای 16 برای هر عدد یک نماد هم اختصاص داده بشه یعنی یه آرایه داشته باشیم که هر خونش یه عدد 0تا 9999 باشه و در مبنای 10000 همون عدد 20 رقمی رو تشکیل بده
    حالا می شه به راحتی این اعداد را که کوچکتر از 10000 هستند رو در هم ضرب کرد (بدون نیاز به کد اضافی) و بقیه مراحل ضرب هم مثل ضرب معمولی فقط توی یه مبنای بزرگ تر
    شاید بگید خوب که چی؟
    به نظر من این روش نسبت به حالتی که عدد رو توی یه آرایه 20 تایی در مبنای 10 بریزیم خیلی سریع تره
    نظر شما چیه؟

  14. #14
    کاربر دائمی آواتار aram_2
    تاریخ عضویت
    فروردین 1390
    محل زندگی
    زمین
    سن
    37
    پست
    476

    نقل قول: ضرب اعداد بزرگ

    می تونید دو عدد رو با لگاریتم به یه میدان دیگه ببرید و کارتون رو راحت انجام بدید.
    log(x*y)=log(x)+log(y)

  15. #15

    نقل قول: ضرب اعداد بزرگ

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

    100 digits.rar

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

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