جمع دو عدد بزرگ در C/C++ با استفاده از پوینتر (Pointer)

یکی از برنامه های معروف برای تمرین آرایه ها در برنامه نویسی های سطح پایین، برنامه جمع دو عدد خیلی خیلی بزرگ ( برای مثال ۱۰۰۰ رقمی ) هست. برای این کار طبیعتا نمیتونیم فقط دوتا int یا حتی long long int درست کنیم. راه حل اینه که یه آرایه درست کنیم و هر رقم از عدد رو تو یکی از خونه های اون ذخیره کنیم و از اون جا به بعد مثل جمع ستونی کلاس سوم دبستان جلو بریم !‌

الگوریتم

۱. دو تا ورودی از کاربر می گیریم و توی دو تا آرایه مجزا از نوع char دخیره می کنیم.

۲. آرایه رو برعکس می کنیم ( یا از سمت راست شروع می کنیم )

۳. هر کاراکتر رو تبدیل به عدد می کنیم و هر دو رو با هم جمع می کنیم.

۴. باقی مانده عدد رو از مبنا ( اینجا ۱۰ ) به خونه سمت چپی اضافه می کنیم.

۵. عدد رو بر ۱۰ تقسیم می کنیم ( بدون اعشار )

۶. همین کارو تا آخر آرایه انجام می دیم.

 

حالا اگر استادا یکم ناجور باشن ( یا بقول خودشون دلسوز ) میان میگن در کد این سوال از براکت [] استفاده نکنید تا ما مجبور شیم از پوینتر و Dynamic memory allocation استفاده کنیم.

 

ورودی

 

در خط اول مبنای اعداد وارد می شود. ( تضمین می شود که ورودی ها در مبنای درست می باشد و تبدیل مبنا لازم نیست )

سپس دو عدد با تعداد ارقام نا معلوم وارد می شود .

مبنا عددی بین ۲ تا ۱۰ می باشد.

تعداد ارقام عدد میتواند تا ۱۰۱۰۰۰۰ باشد.

 

خروجی

خروجی شما باید جمع ۲ عدد داده شده در مبنای مورد نظر باشد.

 

نمونه ورودی ۱

 

۱۰ 
۶۴۷۵۵۹۵۲۲۱۲۰۴۹۹۱۷۲۳۳ ۸۰۸۴۹۴۳۵۶۳

نمونه خروجی ۱

 

۶۴۷۵۵۹۵۲۲۲۰۱۳۴۸۶۰۷۹۶

 

 

نمونه ورودی ۲

 

۲
۱۱۱۱۱۱۰ ۱۰

نمونه خروجی ۲

 

۱۰۰۰۰۰۰۰

 

کد :

 

#include 
#include 
int main()
{
    int base;
    scanf("%d ",&base);
    char *a;
    char *b;
    a=(char*)malloc(10000*sizeof(char ));
    b=(char*)malloc(10000*sizeof(char));
    int min,max,i,l1,l2,d=0,i1,i2;
    scanf("%s %s",a,b);
    l1=strlen(a);
    l2=strlen(b);
    if (l1>l2)
    {
        max=l1;
    }
    else
    {
        max=l2;
    }
    i1=l1-1;
    i2=l2-1;
    char *c;
    c=(char*)calloc(max+1,sizeof(char));
    for (i=max;i>=0;i--)
    {

        if (i1==-1)
        {
            i1=0;
            *(a+i1)='0';
        }

        if (i2==-1)
        {
            i2=0;
            *(b+i2)='0';
        }
        *(c+i)=(d+( *(a+i1)-48)+(*(b+i2)-48))%base;
        d= (d+(*(a+i1)-48)+(*(b+i2)-48))/base;
        i1--;
        i2--;

    }
    for(i=0;i<=max;i++) {
            if (*(c+i) == 0 && i==0) {
                continue;
            }
            printf("%d", *(c+i));
        }
    return 0;
}