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

مساعدة في طريقة إيجاد القاسم المشترك الأصغر غير 1

بدأه omb10 في 1 أغسطس 2008 · 10 رد · 8,132 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أحتاج إلئ مساعدة في طريقة إيجاد القاسم المشترك الأصغر للسلسلة من الأرقام INTEGER غير الرقم 1.

في الغالب سأحتاج لعمل Recursion

شكرا.

#2

أولا أظن أن مكان هذا الموضوع هو قسم الرياضيات والخوارزميات

هناك عدة طرق

مثلا:

نقوم بعمل حلقة تكرارية على متغير i و نجرب هل يعتبر باقي قسمة العددين على i يساوي 0

في كل مرة لا يتحقق الشرط نضيف 1 لـ i و نعيد الكرة

شرط التوقف هو العثور على قاسم مشترك

يمكن أن نجعل مجال البحث هو من 2 إلى أصغر العددين

#3

طريقه أخرى ،

LCM(x,y) = x*y / GCD(x,y)

قم باستخراج القاسم الأعظم للعدين واقسم حاصل ضرب العددين على الناتج من عمليه القسمه ،

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 2 أغسطس 2008 في 01:28

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#4
Wajdy Essam كتب:
طريقه أخرى ،

LCM(x,y) = x*y / GCD(x,y)

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

النتيجة دائما أقل من 1

أليس كذلك

القاسم الأكبر حتما أصغر من أو يساوي أضغر العددين

و لما نقسم هذا العدد على عدد كبير عليه

النتيجة أصغر من 1

أم أن هناك شيئ لم أفهمه؟

#5

كتبت المعادله صح ، لكني أخطأت في شرحها وقمت بتعديلها بعد ذلك ،لكن ما شاء الله عليك طلعت سريع في الكتابه :)

مثال :

lcm(36, 78) = 36 · 78/(36, 78) = 36 · 78/6 = 6 · 78 = 468

شكرا لك أخي djug ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#6

أسف يا إخوة يبدو أنني لم أشرح السوال جيدا. أنا لا أبحت علئ المضاعف المشترك الأصغر LCD بل القاسم المشترك الأصغر غير الرقم 1. مثلا إدا كانت الأرقام زوجية النتيجة هي 2. و إدا أخدنا 9,18,27,30 النتيجة ستكون 3.

أنا كتبت السوال في هدا القسم لأني أحتاج الجواب علْئ شكل Java method. ولكن Algorithm فقط يكفي.

شكرا و أسف علئ سوء التفاهم.

#7

كتبت هده الدالة لإيجاد النتيجة بالنسبة لعددين.

static int gcd(int x, int y) {
		int min = Math.min(x, y);
		int max = Math.max(x, y);
		int result = 1;
		for ( int i = 2; i <= min; i++) {
			if ( (min % i == 0) && max % i == 0) {
				result = i;
				break;
			}
		}
		return result;

	}

هل من طريقة لإيجادها بالنسبة بسلسلة من3 أرقام أو أكثر.

#8

قم بعمل دالة تنادي هذه الدالة

بشكل تكراري بعدد العناصر التي تريد إيجاد القاسم المشترك الأكبر لها

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

مثال 4و6و8

temp=gcd(4,6)
temp=(temp,8)

في النهاية ستجد الجواب في المتغير temp

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#9
omb10 كتب:
أسف يا إخوة يبدو أنني لم أشرح السوال جيدا. أنا لا أبحت علئ المضاعف المشترك الأصغر LCD بل القاسم المشترك الأصغر غير الرقم 1. مثلا إدا كانت الأرقام زوجية النتيجة هي 2. و إدا أخدنا 9,18,27,30 النتيجة ستكون 3.

أنا كتبت السوال في هدا القسم لأني أحتاج الجواب علْئ شكل Java method. ولكن Algorithm فقط يكفي.

شكرا و أسف علئ سوء التفاهم.

نعم هذا ما شرحته لك في المشاركة رقم 2

أخي علاء توجد طريقة "أجمل" من عمل دالة تنادي أخواتها عدة مرات (الوقت و الذاكرة اللازمين لذلك كبير نسبيا)

  1.  
  2.  
  3. static int gcd(int NbParam, ArrayList<int> lst) {
  4.  
  5.  
  6. int min = lstMin(lst);//نفرض أنك قمت بكتابة هذه الدالة و التي تعطيك أصغر قيمة موجودة في ArrayLi
    st
  7.  
  8. int result = 1;//الحل القياسي هو 1
  9. for ( int i = 2; i <= min; i++)
  10. {
  11. boolean found =true;// وجدنا الواحد حلا إذا المتغير يأخذ القيمة "صحيح"
  12. if (min % i == 0)// إذا لم يقم العدد أصغر المجموعة فلا داعي للمحاولة مع الآخرين
  13. {
  14. int inedexList =0;//
  15. while(indexList<nbParam)
  16. {
  17. if(!(lst[indexList] % i == 0))//الشرط غير مخقق
  18. {
  19. found =false;
  20. break;// لا نحتاج لمواصلة البحث
  21. }
  22.  
  23. result=i;//نصل إلى هذا الأمر فقط إذا لم يتحقق الشرط السابق أي أننا لم نصل إ
    لى الـ break
  24. }
  25. }
  26. if(found)break;//نخرج من الحلقة لدى توفر أول نتيجة
  27.  
  28. }
  29. }
  30. return result;
  31.  
  32. }
  33.  
  34.  

ملاحظة: لم أجرب هذا البرنامج بعد...مهمتك أنت تجريبه و تصحيح الأخطاء -إن وجدت-

#10

هذا برنامجك وتم تجربته عدة مرات بنجاح ولكن بلغة الVB

ان كان أحد يفهم فى اللغتين يترجمه لك

ولو أردت أن أشرحه لك خطوة بخطوة فأنا مستعد

Private Sub Command1_Click()

N = InputBox("ENTER NUMBERS")

For I = 1 To N

X(I) = InputBox("ENTER NO", I)

Next I

For I = 1 To X(1)

DEV = X(1) / I

If Int(DEV) = DEV Then GoTo 10

GoTo 20

10 For J = 2 To N

SSS = X(J) / DEV

If Int(SSS) = SSS Then GoTo 100

GoTo 20

100 Next J

GoTo 30

20 Next I

30 Text1.Text = DEV

End Sub

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

السلام عليكــم ورحمـة الله وبركاتــة ،،

الحمدلله والصلاة والسلام على رسول الله وعلى آله وصحبه أجمعين

شكراً لك اخي الكريم

#11
djug كتب:
نعم هذا ما شرحته لك في المشاركة رقم 2

أخي علاء توجد طريقة "أجمل" من عمل دالة تنادي أخواتها عدة مرات (الوقت و الذاكرة اللازمين لذلك كبير نسبيا)

ملاحظة: لم أجرب هذا البرنامج بعد...مهمتك أنت تجريبه و تصحيح الأخطاء -إن وجدت-

شكرا أخي, طريقتك اشتغلت بعد تصحيح بعض الأخطاء الطفيفة.

جزاك الله خيرا.

وشكرا للجميع علئ المساعدة.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…