PDA

View Full Version : سوال: جمع دو عدد بزرگ



amirfarshad
سه شنبه 19 آذر 1387, 18:49 عصر
برای جمع دو عدد بزرگ، مثلا ده هزار رقمی، به این گونه عمل میکنند که هر عدد را در یک آرایه ریخته به گونه ای که هر رقم آن در یک خانه از آرایه باشد و آن آرایه را از جنس char میگیرند، البته در زبان C، چون در این زبان کمترین میزان حافظه را، این نوع میگیرد، یعنی یک بایت و نمونه هایی هم که من روی نت دیدم با این زبان بودند.
سپس خانه های نظیر به نظیر هر آرایه را از یکان اعداد، با هم جمع کرده و سپس مقدار حاصل را اگر بزرگتر از 10 باشد، تقسیم بر 10 نموده و باقیمانده را در آرایه سوم که نتایج را در برمیگیرد، قرار میدهند و یک واحد به خانه بعدی اضافه میکنند.
حال من میخواهم این برنامه را در جاوا بنویسم.

اما سوال:
در جاوا به نظرم بهتره که از نوع char استفاده نکنم چون حجمی معادل 2 بایت دارد. اما نوع byte حجم 1 بایت را دارد. بعد چون بایت از نوع عددی هست، تبدیل تایپها رو هم نخواهیم داشت.
اگر به جای یک رقم یک رقم کردن اون اعداد، اونها رو به اعداد چند رقمی تقسیم کنم، مثلا 4 رقمی، خوب از میزان 2 بایتی short میشه استفاده کرد، اینجوری به جای جمع کردن 4 تا جفت تک رقم، فقط 1 جفت 4 رقمی استفاده میشود، و در حلقه، ما 3 مرحله جلو میافتیم. آیا این مسئله موجب کاهش زمان محاسبه میشود؟
اگر از نوع های بالاتر مانند int و long و ... استفاده کنیم چطور؟

زمان تبدیل یک عدد 10 هزار رقمی به یک آرایه با ارقام 4 رقمی رو محاسبه نکنید.

solisoheila
دوشنبه 30 دی 1387, 11:29 صبح
کد جمع دو عدد بزرگ در آرایه می خواستم .

saeedIRHA
دوشنبه 30 دی 1387, 11:47 صبح
سلام
از کلاس BigInteger هم ميتونيد برای ارقام بزرگ استفاده کنيد
اطلاعات تکميلی رو ميتونيد اينجا پيدا کنيد:
http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigInteger.html

shask00l
دوشنبه 30 دی 1387, 12:10 عصر
برای جمع دو عدد بزرگ، مثلا ده هزار رقمی، به این گونه عمل میکنند که هر عدد را در یک آرایه ریخته به گونه ای که هر رقم آن در یک خانه از آرایه باشد و آن آرایه را از جنس char میگیرند، البته در زبان C، چون در این زبان کمترین میزان حافظه را، این نوع میگیرد، یعنی یک بایت و نمونه هایی هم که من روی نت دیدم با این زبان بودند.
سپس خانه های نظیر به نظیر هر آرایه را از یکان اعداد، با هم جمع کرده و سپس مقدار حاصل را اگر بزرگتر از 10 باشد، تقسیم بر 10 نموده و باقیمانده را در آرایه سوم که نتایج را در برمیگیرد، قرار میدهند و یک واحد به خانه بعدی اضافه میکنند.
حال من میخواهم این برنامه را در جاوا بنویسم.

اما سوال:
در جاوا به نظرم بهتره که از نوع char استفاده نکنم چون حجمی معادل 2 بایت دارد. اما نوع byte حجم 1 بایت را دارد. بعد چون بایت از نوع عددی هست، تبدیل تایپها رو هم نخواهیم داشت.
اگر به جای یک رقم یک رقم کردن اون اعداد، اونها رو به اعداد چند رقمی تقسیم کنم، مثلا 4 رقمی، خوب از میزان 2 بایتی short میشه استفاده کرد، اینجوری به جای جمع کردن 4 تا جفت تک رقم، فقط 1 جفت 4 رقمی استفاده میشود، و در حلقه، ما 3 مرحله جلو میافتیم. آیا این مسئله موجب کاهش زمان محاسبه میشود؟
اگر از نوع های بالاتر مانند int و long و ... استفاده کنیم چطور؟

زمان تبدیل یک عدد 10 هزار رقمی به یک آرایه با ارقام 4 رقمی رو محاسبه نکنید.

طرحی که مطرح کردید... طرح بسیار جالبیه .. ولی الگوریتمش ممکنه خیلی پیچیده بشه . و درصد خطا هم بالا میره ... توی 1 تابع که این کار رو بصورت معمولی انجام میده برای تک تک سلول ها تایپ کستینگ انجام میشه .. ولی طرحی که شما مطرح کردید به دور زدن این جریان کمک میکنه . تنها مشکلی که هست اینه که برای انجام این کار ما به یک روال دیگه نیاز داریم که بیاد 4تا 4تا یا هر تعداد دیگه جدا کنه . و بعد 1 سره تبدیلشون کنه که در عمل باز هم نسبت به محاسبه ای که برای 4 رقم انجام دادید بیشتر زمان میبره . exeption ها رو هم حساب کنید ...

ولی در جمع طرح جالبیه . شاید در این زمینه زیاد کارا نباشه ... ولی استفاده های زیادی داره ...

Nazanin-Zohreh
دوشنبه 30 دی 1387, 14:23 عصر
سلام :


در مورد سوال شما من یه نظر دارم البته نمیگم که نظر من درسته فقط با نظرم میخوام آشنا بشید :

به نظر من جواب سوال شما برمیگرده به ثباتهای cpu . مثلا اگر ما برای جمع عدد 4 با 5 کدی بنویسیم در هنگام کامپایل، عدد 4 به کد باینری تبدیل شده و سپس در ثبات مینشیند و بعد از آن عدد 5 به باینری تبدیل شده و آن هم در ثبات دیگر مینشیند و بعد از آن عملیات منطقی جمع بر روی این دو ثبات انجام خواهد گرفت . پس اگر ما عددها رو تک رقم تک رقم یا چند رقم چند رقم هم بگیریم هیچ تفاوتی نداره . چون حتما و حتما باید یکان ها محاسبه شده سپس به سراغ دهگان و الی آخر برویم .

shask00l
سه شنبه 01 بهمن 1387, 06:57 صبح
اون بخش از کار ربطی به برنامه نویس نداره .... کامپایلر و پردازنده مسئول اون بخش هستند . البته در برنامه نویسی low level حرف شما کاملا صحیحه ... ولی توی level های بالاتر ... فرض کنید پردازنده با روشی که شما گفتید این عمل رو انجام میده ... اونوقت دیگه فرقی نمیکنه که ما تک تک جمع بزنیم یا 4 تا 4تا ... در این شرایط اگر ما برای جدا کردن اعداد بصورت 4تا 4تا تابع جداگانه ای بنویسیم فقط cpu load رو بالا بردیم و برای محاسبه هیچ تفاوتی ابجاد نمیشه ... بار اضافه مربوط به 4تا 4تا جدا کردن رو هم به کار اضافه کنید .

البته این نظر منه ... :لبخندساده: شاید من اشتباه فکر میکنم ؟

پ.ن : شاید قدیما این موضوع مهم و در بعضی جاها حیاطی بود ولی ماشاالله این روزا cpu ها اینقدر گردن کلفت شدن که یه حلقه 10000 دوری که خوبه 100000 دورش هم براشون شوخی محسوب میشه .

amirfarshad
سه شنبه 01 بهمن 1387, 13:07 عصر
سلام
از کلاس BigInteger هم ميتونيد برای ارقام بزرگ استفاده کنيد
اطلاعات تکميلی رو ميتونيد اينجا پيدا کنيد:
http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigInteger.html
ممنونم
ولی biginteger محدوده، برای عددهای بزرگتر از اون منظورم هست، مثلا 1000 رقمی و بیشتر.

amirfarshad
سه شنبه 01 بهمن 1387, 13:14 عصر
در حالتهای معمول که کدش هم رو نت میشه پیدا کرد، میان کل عدد رو به آرایه ای از اعداد یک رقمی تبدیل میکنن و بعد اون رو توی یه حلقه با عدد دیگر جمع میکنن.
حالا اینجا من خواستم که اون اعداد رو به واحدهای بزرگتر تبدیل کنم، از لحاظ زمان توی تبدیل کردن خیلی فرق نداره، ولی اون حلقه اصلی برنامه که کار جمع رو انجام میده، تعدداد چرخش توی حلقه کمتر میشه و این موجب کم شدن زمان میشه.
تبدیل دیتا تایپ رو هم که در هر صورت داریم، چون یک عدد 10000 رقمی رو به عنوان مثال، نمیشه توی هیچ تایپ عددی، توی هیچ زبانی نگهداری کرد.
این تغییر دیتا تایپ هم فکر کنم زمان کمتری بگیره، چون تعداد اعدادی که باید تبدیل بشن، در مجموع کمتر از حالتی هست که عدد اصلی ، یک رقم، یک رقم جدا شده.
اما در مورد خطا ها، فکر نکنم خطای خاصی باشه که نشه جلوش رو گرفت، چند تا تکه تکه کردن، چند تا تغییر تایپ و چند تا جمع و یک به هم چسباندن داریم فقط.
برای جمع طرح نسبتا خوبیه، ولی الگوریتم جمع رو معمولا بسط میدن به ضرب و توان و فاکتوریل، که این الگوریتم رو نمیشه به راحتی بسطش داد و احتمال ایجاد مشکل زیاد میشه.