یکی از برنامه های معروف برای تمرین آرایه ها در برنامه نویسی های سطح پایین، برنامه جمع دو عدد خیلی خیلی بزرگ ( برای مثال ۱۰۰۰ رقمی ) هست. برای این کار طبیعتا نمیتونیم فقط دوتا 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;
}
