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