الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشروع رقم 1.

بدأه فهدالشلوي في 19 أغسطس 2008 · 42 رد · 6,927 مشاهدة · في مشاريع ومسابقات القسم
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم.

طبعا قسم الدلفي اليومين هذي متقدمين علينا شوي بمشارعيهم ونشاطهم .

وأعضاء قسم السي لن يرضيهم ذلك عشان كذا سوف نقترح عمل مشروع

مشترك بيننا في قسم السي نطبق عليه الآليات والخوارزميات وأساليب السي المميزه

مبدائيا لدي فكره يمكن فيها شوي صعوبه لكن هذا الي في راسي الآن : نعمل مكتبه بالسي لجمع الأعداد الطويله جدا ولطرحها اعداد من اكثر من 300 خانه مثلا.

طبعا هذا اقتراح اذا فيه احد عنده فكره أخرى فليضعها ونشوف المناسب.

أرجوا ان يتحرك معي أحد قسم الدلفي يتحدونا .....

tvquran_6.gif

#2

شكرا اخى فهد على مبادرتك ......

اولا : اللغة المستخدمة ؟؟ السى ام السى++ ؟

ثانيا : ممكن شرح اكثر للفكرة ؟؟ هل هى عدد مكون من 300 خانة و اكثر و تطبيق الحسابات عليها ؟(جمع و طرح)

شكرا جزيلا

وفقك الله

#3

الفكرة ننشي كلاس نضع فيه دوال مناسبه تسمع بجمع أعداد بهذا الشكل مثلا:

mytype a="12349999999999999999959555858578575757575575757";
mytype b="45535335399000000000011111111111";
mytype c=a+b;
myype d=a-b;

اللغة المستخدمه c++

غدا أن شاء الله ساكتب كلاس يحمل اسماء الدوال ونبداء نشترك فيها ونشرح بعض الافكار ايضا في الموضوع.

راح نستفيد ان شاء الله من هذا الموضوع كتدريب عملي لنا .

طبعا نحن نتعامل مع الاعداد على انها نصوص ونحتاج عمليات تحويل وتعامل مع هذه النصوص .

سنفكر في الموضوع مثل تفكيرنا عندما نجمع اعداد :

مثلا : 163 +56 =

سوف نجمع 3 + 6 =9

6+5=11 نبقي 1 ونضيف واحد الى العدد الذي يليه

وهكذا..

tvquran_6.gif

#4

دى فكرة حلوة ........ ليست صعبة باذن الله

معك ان شاء الله

وفقك و وفقنا الله

#5

مشروع جيد .. وهو أحد مشاريع الدراسة :) ,,

يسمون مثل هذا بال BigInteger .. وهو موجود بالجافا لمن أراد تفصيل أكثر .

من رأيي أننا سنحتاج لثلاث كلاسات :

1- String : وهو مجرد تغليف لل std::string .. واضافة دوال خاصة للتحويل من والى الارقام .

2- كلاس مثل Vector أو List : ليحمل الارقام .. يتمدد ديناميكا .

3-كلاس BigInteger ( أو اي اسم ) .. يستغل الكلاسين السابقين ويحوي الدوال التي سيضعها الاخ فهد .

طبعا ما سبق ذكره مجرد اقتراح .. اذا كان لديك تصور آخر أخي فهد .. فسنراه .. ونطبقه ان شاء الله ...أهم شيء تنفيذ الفكرة ..

لكن فكرة تقسيم العمل الى كلاسات ,, رح تؤدي الى مشاركة أكثر من عضو ..

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#6

يا جماعة انا فى بالى فكرة بس مش عارف صح ولا لا ...........

احنا نعمل 2 array كبيــــــــرة (one dimensional array) و نضع الارقام فيها بدءا من units ..... كل digit فى عنصر ....

و نجمع الاول على الاول و ننقل الرقم tens المتبقى على اللى بعده و هكذا كما شرحها اخ فهد ( مش عارف اشرحها بوضوح)

هل الفكرة دى سليمة ام لا ؟؟؟؟

#7

مجرد فكرة: مشروع جلب أخر مواضيع قسم من المنتدى او اخر ردود مجموعة من المواضيع دون دخول المنتدى

Don’t Imitate, Innovate

d4baa0.gif
#8

هذا كلاس مبداء وضعته وضعت باني وأعاده تعريف لعمليه الجمع سوف نحتاج الى تعديلات عليه كثيرة.

بالنسبه لقتراحك أخي الشمري توزيع العمل على ثلاث كلاسات في حاله وسعنا العمل راح يصر هو الأفضل

لكن الآن فقط نريد في هذا الجزء من المشروع تعريف عمليتين الجمع والطرح.

  1.  
  2. class BigInteger
  3. {
  4. private:
  5.  
  6.  
  7. public:
  8. BigInteger();
  9. BigInteger(string);
  10. BigInteger operator + (BigInteger);
  11. BigInteger operator - (BigInteger);
  12.  
  13. };
  14.  
  15.  

حاولت أحاكي عمليه الجمع على الورقه لكن نحتاج ان نتعامل مع عناصر المصفوفه من الأخير

لذلك أعتقد من الأفضل ان نعكس العدد

tvquran_6.gif

#9

هذا طريقه تفكيري في عمليه الجمع :

a="53018"

b="823"

a+b

سوف أحتاج لداله تقلب العدد

a="81035"

b="32800"

c=a+b

لاحظ أني اضفت أصفار للعدد الأصغر من أجل ان يكون له نفس عدد خانات العدد الاكبر

أعرف متغير h لأضع فيه العدد المرفوع خانة العشرات دائما.

h=0

a+b

a[0]+b[0]+h=8+3+0=11

c[0]=1 ;h=1

a[1]+b[1]+h=1+2+1=4

c[1]=4;h=0

a[2]+b[2]+h=0+8+0=8

c[2]=8;h=0

a[3]+b[3]+h=3+0+0=3

c[3]=3;h=0

a[4]+b[4]+h=5+0+0=5

c[4]=5

c=14835

نقلبها

c=53841

tvquran_6.gif

#10

مشروع جدا جميل أخوي ومعلمي فهد الشلوي

صراحة انت هكذا سوف تثري المنتدى بهذا المشروع وماشاء الله عليك ماسك القسم كامل

stl تعبر عن عدد ورقم خانة ( الفكرة)

العدد ورقم الخانة والذي يبدأ بالصفر (خانة الآحاد)

فمثلا لوعندنا الأعداد التالية : "538"

نقدر نحللها الى

8*10^رقم الخانة

+

3*10^رقم الخانة

+

5*10^رقم الخانة

طيب لو كان هناك ارقام بعد الفاصلة العشرية نبدأ عد من جديد من الخانة 0 بعد الفاصلة مثلا نفس الرقم السابق بإضافة اعداد عشرية "538.349"

8*10^رقم الخانة

+

3*10^رقم الخانة

+

5*10^رقم الخانة

+

3*10^-رقم الخانة

+

4*10^-رقم الخانة

+

9*10^-رقم الخانة

كيف نحلل رقم الخانة

نحلل النص الى قسمين قسم بعد وقبل الفاصلة

قسم الأعداد الصحيحة الخانة الأولى من اليسار سوف تكون (length-1) والثاني سوف يكون (length-2) الى

(length-length) .

قسم الأعداد العشرية نبدأ من 0 الى واحد بالتدرج ابتداء من اليسار .

كذا يصير عندنا يا اخواني

2147483647*2 خانة لو وصلها احد كلموني

فكرة يرجو النظر فيها

تم تعديل هذه المشاركة بواسطة مصفوفة في 20 أغسطس 2008 في 06:39

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#11

مصفوفة حياك الله في الاول اعداد صحيحة في التطوير باذن الله نضيف الاعداد العشرية.

مجرد فكرة: مشروع جلب أخر مواضيع قسم من المنتدى او اخر ردود مجموعة من المواضيع دون دخول المنتدى

فكرة جيدة لكن سيكون في الخطه او احد الاعضاء يستلمه ويديره.

اقتباس
Don’t Imitate, Innovate

هذا يسمى نقل خبرات.

tvquran_6.gif

#12

اخوى فهد اعذرنى فى التأخر على الرد .... معلش كنت مهنج شوية :lol: و انا اقرأ الردود فقرأتها اكتر من مرة عشان افهم

لى استفسار فى مشاركتك : لماذا نعكس العدد ؟؟

=====================

هل عندما نعامل عدد على انه string نصى

سوف نقوم بتقسيمه و اخذ كل جزء و وضعه فى متغير رقمى ؟؟

#13

السلام عليكم هذه خطوه أولى في الكود

هنا لم اتتبع الاخطاء التي ممكن يرتكبها المستخدم سنجعلها في الخطوات الاخيرة

مثل ان يدخل المستخدم أحرف بدل الارقام!

#include<string>
#include<cstring>
using namespace std;

class BigInteger
{
private:
string First_Number;/*الرقم المدخل*/
int size;/*قياس الرقم*/
void contrary();/*عكس اتجاه الرقم*/
int CharToInt(char);/*تحويل الحرف الي رقم*/
public:
BigInteger();/*الباني*/
BigInteger(string);/*من هنا يتم استقبال الرقم*/
string show();/*عرض النص*/
BigInteger operator + (BigInteger);/*أعاده تعريف الجمع*/
BigInteger operator - (BigInteger);
BigInteger operator * (BigInteger);
BigInteger operator / (BigInteger);

};

BigInteger::BigInteger():size(0) /*تمهيد الى القيمه صفر*/
{}
BigInteger::BigInteger(string num)
{
First_Number=num; /*تعيين قيمه للعدد*/
size=num.length();/*أخذ طول العدد*/
contrary();/*عكسنا العدد*/
}
void BigInteger::contrary()
{
for(int i=0;i<size/2;i++)
swap(First_Number,First_Number[size-i-1]); /*نبدل بين العنصر الأول والاخير ثم الثاني وما قبل الاخير ... وهكذا*/
}
int BigInteger::CharToInt(char ch){ return int(ch)-48;}/*نحول من حرف الي رقم الصفر يقابله 48 والواحد يقابله 49 وهكذا */

BigInteger BigInteger:: operator + (BigInteger right)/*اعاده تعريف الجمع*/
{ BigInteger tmp; /*الناتج سيكون هنا*/
int z=(size>right.size)?size:right.size; /*اطول العددين*/
int def=size-right.size;/*الفرق بين طول العددين*/
if(def !=0)/*هل هناك فرق في طول العددين*/
(size<right.size)?First_Number.append(right.size-size,'0'):right.First_Number.append(size-right.size,'0');/*أضافه اصفار للعدد الاقصر ليكون مساوي في الطول للاخر*/
int h=0,m=0,j=0;
for(int i=0;i<z;i++)
{
m= CharToInt(First_Number.at(i)) + CharToInt(right.First_Number.at(i))+h;
h=m/10;
j=(m>9)?m%10:m;
tmp.First_Number.insert(i,1,char(j+48)); }
tmp.contrary();
return tmp;
}
string BigInteger::show()
{ return First_Number;
}

int main(int argc, char *argv[])
{

BigInteger a("1283");
BigInteger b("12");
BigInteger c=b+a;
cout<<c.show()<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}

ملاحظه الناتج في الاخير يطلع مقلوب سوف ابحث عن السبب

وارجوا ان تحاولوا معي ايضا

من يبداء في عمليه الطرح او الضرب او القسمه هناك ثلاث عمليات اخرى.

عدلت من gcode الى code من أجل ان هناك مشكله في النسخ من الأول ولكن الثاني لامشكل فيه.

تم تعديل هذه المشاركة بواسطة فهدالشلوي في 20 أغسطس 2008 في 22:34

tvquran_6.gif

#14

اهلا عمر : نحن في جمع الأعداد نجمع من الاحاد ثم العشرات وهكذا من اليمين الى اليسار اليس كذلك.

لكن في التعامل مع النصوص والمصفوفات نتعامل من اليسار الي اليمين.

لذلك علينا ان نبداء بالتعامل مع المصفوفات من اليمين او نجمع من اليسار فالاسهل نقلب العدد ونجمع من اليسار ثم بعد ذلك نقلب العدد مرة أخرى.

tvquran_6.gif

#16

لم أقرأ كل الردود .. مستعجل قليلا ..

لكن الفكرة هي بوضع كل ثلاثة أرقام مثلا في node ... ( ممكن يكون Linked list - vector الخ ) ..

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#17

لدي فكرة للتعامل مع الأعداد الكبيرة..لكن ليست بهذه الطريقة

نقوم بتقسيم BigInteger إلى SmallInteger و نتعامل معها بالعمليات المتوفرة(لا نعيد اختراع كل شيء من الصفر)

لا أدري ما هو أكبر عدد يمكن التعامل معه في c++ لكن إليكم الفكرة

نفرض أن أكبر عدد يمكن التعامل معه هو 8 أعداد من الشكل abcdefgh

نقوم بتقسيمها إلى 2

مثلا لجمع عددين من الشكل abcdefgh+ijklmnop

نقسم العدد الأول إلى

abcd

efgh

و الثاني إلى

ijkl

mnop

نقوم بجمع القسمين الأولين مع بعض

و الآخرين مع بعض (دون أن ننسى إضافة الفائض من العملية الأولى-إن وجد-)

و هكذا...نكرر نفس الفكرة (ليست نفس الطريقة ) مع باقي العمليات

أظن إن فعلنا هكذا..سنربح الوقت في البرمجة و في الزمن المستغرق لتنفيذ البرامج

و الله أعلم

ما آراؤكم؟؟

#18
اقتباس
لكن الفكرة هي بوضع كل ثلاثة أرقام مثلا في node ... ( ممكن يكون Linked list - vector الخ ) ..

نعم فكرة جيدة أنها لن تستهلك أكثر من المطلوب بالنسبه للذاكرة لكن ستحتاج مجهود اكثر.

اقتباس
نقوم بتقسيم BigInteger إلى SmallInteger و نتعامل معها بالعمليات المتوفرة(لا نعيد اختراع كل شيء من الصفر)

أول ما فكرت في الموضوع فكرت بنفس طريقتك ولكن وجدت مشاكل كثيره قد تصادفني انا في غنا عنها وتحتاج الى عمليات اكثر تقسيم وباقي ثم بعد ذلك ضرب وترتيب

كانت فكره متعبه لم استطع تحويلها الى كود.

بالنسبه للتعامل معها كصفوف سهله المشكله واصبحت اسهل بكثير وهناك عده طرق للتعامل معها عناك char* وايضا string و vectore

بالنسبه لي اخترت الطريق الاسهل وليس الأفضل.

tvquran_6.gif

#19

أخي فهد

هل فكرت في الزمن المستغرق لدى التشغيل (ألا ترى أن استعمال طريقتك الحالية مكلف من ناحية استهلاك موارد و الوقت ؟)

#20

نعم هناك فرق في الوقت طريقه استخدام النص راح تكون أقل سرعه وتحتاج مساحه أكبر في الذاكرة.

tvquran_6.gif

#21

السلام عليكم .

أولا أعتذر اذا كنتم تتناقشون في وادي ,, وأنا في وادي آخر ... بسبب اني لا استطيع ان اتصل من خلال جهازي في المنزل ,, لذلك كتبت هذا الرد بالبيت .. دون الاطلاع على الردود ,, لذلك المعذرة مقدما ,, في حال طرح أمور تم مناقشتها والاتفاق عليها ,, ولكن ما سأقوله هو رأيي وتحليلي لهذا المشروع ,

- الهدف من المشروع :

كما قال الأخ فهد .. الهدف من المشروع هو توفير كلاس للتعامل مع الأرقام الضخمة مثل " 999999999999999999999999999999999" ,

سواء السالبة أو الموجبة .. وتوفير العمليات الأساسية عليها وتشمل ( الجمع - الطرح - القسمة - الضرب - دوال المقارنة > < الخ .. ) .

- الفكرة :

أسهل طريقة لعمل مثل هذا الكلاس ,, هو بجلب الرقم الضخم والكبير من خلال string .. ثم يتم تجزئة هذا النص الى رقم رقم .. كل رقم يمثل node .. اذن, يمكن الاستفادة من Linked List أو حتى ال Vector للقيام بهذه المهمة .

مثال : لنأخذ هذا النص , نريد تجزئته الى خانات .. كل خانة تحوي رقم من 0 الى 9 . .

أول خانة تمثل اشارة العدد .. اما سالب أو موجب .. وهذه نتعامل معها عن طريق متغير boolean .. عبارة عن flag .. اذا كان سالب يصبح true واذا كان موجب يصبح false

ونلاحظ أننا نبدأ بتحويل النص .. من اليسار الى اليمين .. يعني نبدأ من الخانة رقم صفر .

-09340013

بعد تجزئته وتخزينه في ال Vector :

post-42837-1219262838_thumb.jpg

ملاحظات :

  • كل node .. يحوي رقم من 0 الى 9 .
  • كان من الأفضل أن يأخذ رقم node قيمة أكبر مثل من 0 الى 999 .. ولكن هناك مشاكل .. فمثلا لو أخذنا هذا الرقم .
    1230005 فانه سيتحول الى 12305 .. لان الدالة التي تحول الى رقم مثل atoi تقوم بتجاهل الاصفار الثلاثة .. وتعتبرها صفر واحد .. فلحل هذه المشكلة .. اخترت أن آخذها رقم رقم ... ويوجد حل آخر وهو أن نكتب بأنفسنا دالة تحول النص الى رقم .. ونتحكم بها .
  • الاشارة لا تدخل ضمن ال vector .. انما هي عبارة عن متغير بولي boolean .
  • هناك مشكلة وهي بالارقام التي على اليسار ( صفر على الشمال ) ليس لها فائدة .. لذلك يجب أن نجعل برنامجنا يكتشف ان الرقم الذي على اليسار ليس له فائدة .. وبالتالي لا يدخله ضمن ال vector
  • يجب توفير طريقة لاكتشاف ان جميع محتويات ال string هي اما رقم او اشارة موجب أو اشارة سالب .

مثال :

في المرفقات مثال بسيط .. يقوم بتحويل ال string الى رقم .. وهي الخطوة الأولى .

typedef signed short int  s16; // 16 byte | signed;
class BigInteger
{
private:
	vector<s16> mNodes;
	bool mIsNegative;
public:
	BigInteger(const string &number);
	BigInteger(const BigInteger &other);
	~BigInteger();
	void setString(const string &number);
	void setBigInteger(const BigInteger &other);	 
	inline void negative()// make it negative;
	{
		mIsNegative= !mIsNegative;
	}
	inline bool isNegative()
	{
		return mIsNegative==true;
	}

	void print();
};

int main()
{
	BigInteger bigInteger("-0123456789");
	bigInteger.print();

	BigInteger bi("+00009200002102133301220212331948502131203123");
	bi.print();

	return 0;
}

هذه مجرد محاولة .. واقتراح فقط ... و هي قابلة للأخذ والرد .

BigInteger.zip

تم تعديل هذه المشاركة بواسطة الشمري في 20 أغسطس 2008 في 23:07

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#22

جميل الفكرة ممتازة سوف أحاول تحويلها وتطبيقها على كود بإذن الله.

tvquran_6.gif

#23

هذه تعديلات جديدة عمليه الجمع تعمل بصورة ممتازة فقط الجميع بين اعداد صحيحه موجبه

  1.  
  2. #include<iostream>
  3. #include<vector>
  4. #include<cstring>
  5. using namespace std;
  6.  
  7. class BigInteger
  8. {
  9. private:
  10. vector<short int> nod;
  11. void reserve();
  12. bool sign;
  13.  
  14. public:
  15. BigInteger();
  16. BigInteger(const char*);
  17. void print();
  18. BigInteger operator + (BigInteger);
  19. BigInteger operator - (BigInteger);
  20. BigInteger operator * (BigInteger);
  21. BigInteger operator / (BigInteger);
  22. BigInteger operator > (BigInteger);
  23. BigInteger operator < (BigInteger);
  24.  
  25.  
  26.  
  27. };
  28. void BigInteger::reserve()
  29. {
  30. vector<short int>::size_type sz = nod.size();
  31. for(int i=0;i<sz/2;i++)
  32. {
  33.  
  34. short int t=nod[i];
  35. nod[i]=nod[sz-i-1];
  36. nod[sz-i-1]=t;
  37. }
  38.  
  39. }
  40. BigInteger::BigInteger():sign(true){}
  41.  
  42. BigInteger::BigInteger(const char* num)
  43. {
  44.  
  45. while(*num )
  46. {
  47. if(*num=='-') sign=false;
  48. if(*num>=48 && *num<=58)
  49. nod.push_back(int(*num)-48);
  50. num++;
  51. }
  52.  
  53. }
  54.  
  55. BigInteger BigInteger::operator + (BigInteger right)
  56. {
  57. int up=0 ,result=0;
  58. int m=nod.size()-right.nod.size();
  59.  
  60. if(m>0)
  61. {right.reserve(); for(int i=0;i<m;i++) right.nod.push_back(0);right.reserve();}
  62. else if(m<0)
  63. {reserve(); for(int i=0;i<-m;i++) nod.push_back(0);reserve();}
  64. vector<short int>::reverse_iterator R;
  65. vector<short int>::reverse_iterator L;
  66. for(R=right.nod.rbegin(),L=nod.rbegin();R<right.nod.rend(),L<nod.rend();R++,L++)
  67. {
  68. result=*R+*L+up;
  69.  
  70. up=result/10;
  71. if(result>9)result%=10;
  72. *R=result;
  73. }
  74. if(up>0)
  75. {right.reserve(); right.nod.push_back(up);right.reserve();}
  76.  
  77.  
  78. return right;
  79. }
  80. void BigInteger::print()
  81. {
  82.  
  83. vector<short int>::iterator i;
  84. for(i=nod.begin();i<nod.end();i++)
  85. cout<<*i;
  86. cout<<endl;
  87. }
  88.  
  89.  
  90.  
  91. int main()
  92. {
  93.  
  94. BigInteger a("90000000000039999999444444444444444444444444444444444440");
  95. BigInteger b("53444111111111119999765432321111111111111111111111111111");
  96. BigInteger c=a+b;
  97.  
  98. a.print();
  99. b.print();
  100. c.print();
  101.  
  102.  
  103.  
  104.  
  105. cin.get();
  106. return 0;
  107. }
  108.  
  109.  

tvquran_6.gif

#24

شغل ممتاز أخوي فهد ,,

سأجرب الكود وأرد عليك ,

أنا حاولت البارحة تنفيذ الجمع .. وهو يعمل بشكل سليم .. ولكن المشكلة هي عند اختلاف عدد خانات الاعداد :

123

9

سأنظر في مثالك .. وسأرد عليك بالتفصيل ان شاء الله .

.....

و وجدت أن استخدام List هو أفضل من vector .. لاننا نستطيع الادخال من الأول ومن الاخير .. وهذا سيغنينا عن عمل " عكس " للفكتور...

والله أعلم ,,

سأجرب الكود و أحاول أعمل شيء .

تم تعديل هذه المشاركة بواسطة الشمري في 21 أغسطس 2008 في 16:29

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#25

إخواني الكرام

بخصوص عملة الضرب و إذا عملنا بفكرة كل Node يحتوي على رقم واحد

و إذا كان طول الرقم هو n

قإننا سنحتاج إلى n^2 عملية ضرب و n عملية جمع (تخيلوا الوقت اللازم لها ) لحساب X*Y

إليكم التالي:

لدينا X على الشكل التالي:

245299972.jpg

و Y على الشكل التالي

743161815.jpg

نقوم بتقسيم X إلى A و B

و Y إلى C و D

كالتالي

190337000.jpg

لدينا إذا

331216581.jpg

و عليه فإن عملية الضرب تصبح

906512484.jpg

أي لدينا فقط

4 عمليات ضرب أعدادا من حجم n/2

3 عمليات جمع

و عمليتي إزاحة

هل لاحظتم الفائدة

لكن و لو عمقنا النظر فإنه يمكن عمل أفضل من هذا

طريقة أخرى لكتابة عملة الضرب

get-8-2008-11ng6jzyzfo.JPG

أي

3 عمليات ضرب AC BD A-B * D-C

4 عمليات جمع

عمليتي طرح

عمليتي إزاحة

(هذه الحالة أفضل لأن عملية الضرب مكلفة أكثر من الجمع و الطرح)

تم تعديل هذه المشاركة بواسطة djug في 21 أغسطس 2008 في 22:08

مواضيع مشابهة