PDA

View Full Version : سوال: ضرب و جمع دو عدد 300 رقمی؟



Cru3l.b0y
پنج شنبه 10 اردیبهشت 1388, 19:42 عصر
سلام
یه برنامه به زبان سی میخواستم که دو عدد 300 رقمی رو در هم ضرب و جمع کنه. اگر ممکن منو راهنمایی کنید.
با تشکر

tdkhakpur
پنج شنبه 10 اردیبهشت 1388, 20:45 عصر
سلام:
شما برای اینکه این تعداد عدد رو داشته باشی راهی جز استفاده ار آرایه ای از کاراکتر نداری.
برای این کار فقط میتونم راهنماییت کنم.
ببین شما هر تعداد رقم رو که دارید در یه آرایه از رشته قرار بده یعنی هر عدد داخل یک بایت حافظه بعنوان کاراکتر باشن.
حالا با این روش میتونی دو عدد در دو آرایه داشته باشی.
برای اینکه عملیات جمع و ضرب رو اجرا کنی ابتدا عمل حمع رو بصورت زیر محاسبه کن بعد میتونی ضربش رو هم خودت حل کن.
1 - یه آرایه تقریبا دوبرابر آرایه قبلی برای نتیجه رزرو کن.
2 - از بایتهای اول ارایه شروع کن. و دو بایت رو بر اساس عدد باهم حمع کن در نظر داشته باش مقادیر در آرایه کاراکتری است.
3 - اگه محتوای جمع دو رقم اول از عدد 9 بیشتر شد مقدار (10-عدد حاصل) رو تو اولین بایت از آرایه نتیجه بشورت کاراکتری قرار بده.و مقدار (10/عدد حاصل) رو بطو دستی نگه دار.
3 به همیت ترتیب بایتهای دیگه رو جمع بزن ولی در نظر بگیر که مقدار حاصل رو با مقدار اضافی جمع کنی.
موق باشی.

mg_mahyar
پنج شنبه 10 اردیبهشت 1388, 20:46 عصر
سلام:
شما برای اینکه این تعداد عدد رو داشته باشی راهی جز استفاده ار آرایه ای از کاراکتر نداری.
برای این کار فقط میتونم راهنماییت کنم.
ببین شما هر تعداد رقم رو که دارید در یه آرایه از رشته قرار بده یعنی هر عدد داخل یک بایت حافظه بعنوان کاراکتر باشن.
حالا با این روش میتونی دو عدد در دو آرایه داشته باشی.
برای اینکه عملیات جمع و ضرب رو اجرا کنی ابتدا عمل حمع رو بصورت زیر محاسبه کن بعد میتونی ضربش رو هم خودت حل کن.
1 - یه آرایه تقریبا دوبرابر آرایه قبلی برای نتیجه رزرو کن.
2 - از بایتهای اول ارایه شروع کن. و دو بایت رو بر اساس عدد باهم حمع کن در نظر داشته باش مقادیر در آرایه کاراکتری است.
3 - اگه محتوای جمع دو رقم اول از عدد 9 بیشتر شد مقدار (10-عدد حاصل) رو تو اولین بایت از آرایه نتیجه بشورت کاراکتری قرار بده.و مقدار (10/عدد حاصل) رو بطو دستی نگه دار.
3 به همیت ترتیب بایتهای دیگه رو جمع بزن ولی در نظر بگیر که مقدار حاصل رو با مقدار اضافی جمع کنی.
موق باشی.

با لیست پیوندی هم میشه. البته اگر بتونی کار کنی:بوس:

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

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


byte ToNum(char ch)
{
return ch-'0';
}

char Num1[300];
char Num2[300];
char Result[450];
int c=0;
char carry;
carry = 0;
for( int i=0; i<strlen(Num1); i++)
{
Result[i] = ToNum(Num1[i])-ToNum(Num2[i])%10 + carry+'0';
carry = ToNum(Num1[i])-ToNum(Num2[i])/10;
c++;
}
Result[c] = Carry+'0';
Result[c+1] = 0;

Resultنتیجه نهای خواهد ش

Salar Ashgi
جمعه 11 اردیبهشت 1388, 00:24 صبح
سلام ، به نظر من هم بهترين گزينه ، Linked List يا همان ليست هاي پيوندي است ، چون يك ساختمان داده

پوياست و عمل مديريت حافظه و حذف نود و اضافه و ... براحتي انجام مي گيرد !!!

موفق و پيروز باشيد !!!

sara alavi
جمعه 02 بهمن 1388, 22:38 عصر
میشه نمونه کد linked list را با توضیح بذارید؟
ممنون

qwerty11
شنبه 03 بهمن 1388, 05:01 صبح
سلام !

اگه نظر منو میخوای به هیچ وجه از لیست پیوندی استفاده نکن ! تا وقتی که آرایه کارت رو راه میندازه لیست پیوندی رو ولش کن ! اشاره گر زبان c هروقت دلش بخواد بهت error های بیخودی میده ! تو این سوالم که تو گفتی طول اعداد تا 300 بیشتر نیست، پس نیازی به حافظه ی پویا نداری.

Salar Ashgi
شنبه 03 بهمن 1388, 09:29 صبح
سلام !

اگه نظر منو میخوای به هیچ وجه از لیست پیوندی استفاده نکن ! تا وقتی که آرایه کارت رو راه میندازه لیست پیوندی رو ولش کن ! اشاره گر زبان c هروقت دلش بخواد بهت error های بیخودی میده ! تو این سوالم که تو گفتی طول اعداد تا 300 بیشتر نیست، پس نیازی به حافظه ی پویا نداری.

دوست عزیز ، هر ساختمان داده ای (آرایه ، صف ، پشته ، لیست پیوندی ، درخت ، گراف و ...)

مزایا و معایب خودش رو داره و نمیشه هیچ کدوم رو جایگزین دیگری دانست .

و ما نباید همیشه خودمان را به چیزهای ساده عادت داده و اگر قادر به استفاده از کاربردهای بزرگ

نباشیم ، (منظورم شما نیستید) استفاده از آن کاربرد ها را کوچک تلقی کنیم ، چه بسا

مسائلی هستند که فقط با یک ساختمان داده خاص قابل پیاده سازی اند ، در مورد جمع اعداد

اگر میشود با آرایه این کار را انجام داد ، ولی در مشاهده بسیاری از کد های پیادسازی شده

با آرایه ، اشکالات و خطاهای زیادی بوجود آمده ، در گرفتن حافظه پویا در آرایه ، حافظه زیادی

مصرف میشود ، حال اینکه لیست پیوندی فقط یک داده و یک اشاره گر دارد و کاملا پویاست

و تقریبا میتوان گفت حافظه ای مصرف نمی کند(خیلی کم ) ، در جمع کردن اعداد و قرار دادنشان در

آرایه باید آرایه یکبار Reverse شود و بسیاری از مشکلات دیگر ...

نتیجه گیری : هیچ وقت نسخه خودتو واسه دیگرون تجویز نکن ، چون اگه تو پیچیدن نسخه

خودت اشتباه کرده باشی ، خیلی آدما رو از راه اصلیشون منحرف کردی .

موفق باشید .

qwerty11
شنبه 03 بهمن 1388, 11:06 صبح
دوست عزیز ، هر ساختمان داده ای (آرایه ، صف ، پشته ، لیست پیوندی ، درخت ، گراف و ...) مزایا و معایب خودش رو داره و نمیشه هیچ کدوم رو جایگزین دیگری دانست . و ما نباید همیشه خودمان را به چیزهای ساده عادت داده و اگر قادر به استفاده از کاربردهای بزرگ نباشیم ، (منظورم شما نیستید) استفاده از آن کاربرد ها را کوچک تلقی کنیم ، چه بسا مسائلی هستند که فقط با یک ساختمان داده خاص قابل پیاده سازی اند ، در مورد جمع اعداد اگر میشود با آرایه این کار را انجام داد ، ولی در مشاهده بسیاری از کد های پیادسازی شده با آرایه ، اشکالات و خطاهای زیادی بوجود آمده ، در گرفتن حافظه پویا در آرایه ، حافظه زیادی مصرف میشود ، حال اینکه لیست پیوندی فقط یک داده و یک اشاره گر دارد و کاملا پویاست و تقریبا میتوان گفت حافظه ای مصرف نمی کند(خیلی کم ) ، در جمع کردن اعداد و قرار دادنشان در آرایه باید آرایه یکبار Reverse شود و بسیاری از مشکلات دیگر ...

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

موفق باشید .

خیلی ممنون. اما
من خودم با انواع و اقسام ساختمون داده ها کار کردم و مزایا و معایبشون رو میدونم. لیست پیوندی هم ساختمان داده ای هستش که هم میتونه پیچیدگی زمانی رو کم کنه و هم مصرف حافظه رو کاهش بده. اما اشاره گر و لیست پیوندی زبان c همونطوری که گفتم بعضی وقتها هر کار خودش دلش بخواد انجام میده ! چند وقت پیش بود یه برنامه با c نوشتم که توش لیست پیوندی باید استفاده میکردم. خلاصه هر کاری کردم نشد درست بشه ! به 2 تا آدم غیر از خودمم نشون دادم اونا هم توش موندن چون error الکی میداد! 2 تا متغیر عادی داشتم، یه جا که یکیش عوض میشد اون یکی هم خود به خود عوض میشد! 2 تا متغیر عادی ها نه 2 تا اشاره گر... یا حتی مثلاً پروژه ی پایانیه درس مبانیم همین استفاده از اشاره گرها بود. هیچوقت به طور عادی از برنامه خارج نمیشد! همیشه هروقت که کاربر میگفت بیا بیرون از برنامه، یهو کل tc بسته میشد! خلاصه این چیزا همیشه همراه اشاره گر c هستش به نظر من...
اما در این مورد خاص! همونطور که گفتم چون طول اعداد 300 تا بیشتر نیست استفاده از آرایه راحت ترین کار ممکنه هستش! حتی اگر مثلاً 5000 هم بود باز آرایه بهتر بود. این کد 2 تا عدد n و m رقمی رو جمع میکنه، خودت با کدی که برای لیست نیازش هست مقایسه کن :


int n=num1.strlen(),m=num2.strlen(),carry=0,ans[300]={0},len=0;
for(int i=0; i<m || i<n || carry!=0; i++){
carry += (i<n ? num1[n-i-1]-'0' : 0) + (i<m ? num2[m-1-i]-'0' : 0);
ans[len++]=carry%10;
carry/=10;
}
for(int j=len-1; j>=0; j--)
cout<<ans[j];

Salar Ashgi
یک شنبه 04 بهمن 1388, 18:43 عصر
این نکته را ذکر می کنم و انتظار دارم دیگه در این تاپیک مقایسه بین لیست پیوندی و آرایه انجام نشود :



اما اشاره گر و لیست پیوندی زبان c همونطوری که گفتم بعضی وقتها هر کار خودش دلش بخواد انجام میده ! چند وقت پیش بود یه برنامه با c نوشتم که توش لیست پیوندی باید استفاده میکردم. خلاصه هر کاری کردم نشد درست بشه ! به 2 تا آدم غیر از خودمم نشون دادم اونا هم توش موندن چون error الکی میداد!
ببینید من خیلی آدما رو میشناسم که از اشاره گر توی C++‎ , C مثل یه روح میترسند و وقتی چنین افرادی

که اصلا 2 تا برنامه درست حسابی با اشاره گر ننوشتند ، نظر خودشون رو درباره اشاره گر بیان می کنند ،

همان نظری می دهند ، که شما بیان کردید .(البته صریحا منظورم شما نیستید ، چون خیلی افراد مبتدی

نیز که تازه با اشاره گر آشنا میشوند این نظر را دارند )