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

ما هو اصغر رقم يمكن قسمته على الارقام من 1 إلى 20

بدأه Wael Dalloul في 19 ديسمبر 2009 · 18 رد · 17,818 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كما وعدتكم سوف انقل لكم بعض مسائل موقع Project Euler وذلك لكي نتشارك في افكار الحل و تعم الفائدة بإذن الله, سوف ابدأ بأسئلة سهلة من الموقع نفسه و من ثم نقوم بتصعيبها مع الوقت, سوف استمر في جلب المسائل طالما هناك تفاعل, بسم الله نبدأ مع المسألة رقم 5 من الموقع نفسه:

2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest number that is evenly divisible by all of the numbers from 1 to 20?

نص المسألة بالعربي:

الرقم 2520 هو اصغر رقم يمكن قسمته على جميع الاعداد من 1 إلى 10 وذلك بدون باقي قسمة, ما هو اصغر رقم يمكن قسمته على جميع الاعداد بين 1 و 20؟

ملاحظات هامة:

1- الجواب يجب ان يكون عبارة عن الخوارزمية التي أدت إلى اكتشاف الرقم, سواء كانت هذه الخوارزمية رياضية او برمجية, و ارجوا من الجميع عدم وضع الرقم نفسه و اي احد يضع الرقم نفسه سوف تتعرض مشاركته للتحرير وسوف يتم إزالة الرقم.

2- ما نريده هو افضل خوارزمية لحل المسألة, لذلك حاول اختبار كفائة الخوارزمية قبل وضعها(الوقت الذي يأخذه تنفيذ الخوارزمية لاكتشاف الحل)

تم تعديل هذه المشاركة بواسطة Wael Dalloul في 19 ديسمبر 2009 في 12:11

2

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#2

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

بداية, العدد المطلوب يجب أن يكون باقي قسمته على الأعداد من 2 إلى 20 يساوي الصفر.

الملاحظة الأولى, هي أن أي عدد:

يقبل القسمة على 20 فهو يقبل القسمة على 2 و 4 و 5 و 10

يقبل القسمة على 18 فهو يقبل القسمة على 3 و 6 و 9

يقبل القسمة على 16 فهو يقبل القسمة على 8

يقبل القسمة على 14 فهو يقبل القسمة على 7

قمنا باختصار مجال الفحص إلى:

[11, 20]

الخطوة التالية, نقوم بتحليل الأعداد إلى عواملها الأولية:

11:     11
12:     2, 2, 3
13:     13
14:     2, 7
15:     3, 5
16:     2, 2, 2, 2
17:     17
18:     2, 3, 3
19:     19
19:     2, 2, 5

العدد المطلوب, يجب أن يحتوي على العوامل الأولية لكل عدد في القائمة السابقة, بالتالي:

{2, 2, 2, 2, 3, 3, 5, 7, 11, 13, 17, 19}

بضرب الأعداد في المذكورة في بعضها:

2*2*2*2*3*3*5*7*11*13*17*19

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

إن كان هناك خطوة غير واضحة, لابأس من مناقشتها,

تحياتي,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 19 ديسمبر 2009 في 14:04

2
#3

اخى خالد بارك الله فيك

ما تفضلت به حضرتك هو تحليل رياضى بحت وطبعا هو تحليل ممتاز. ولكن اين الخوارزميه التى يمكن تحويلها الى برنامج يفهمه الحاسب الالى؟

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

#4

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

اساس الخوارزمية التي اتبعتها تقوم على أن الرقم من مضاعفات 20 (اي جعل خطوة الحلقة 20)

ولكن احببت ان ارى الفرق في سرعة تنفيذ نفس الخوارزمية بين عدة مترجمات (تبعا" لمعالجي وذواكري)لأجد :

VB6:199 Second

    x = 0
    Do
        x = x + 20
        For i = 1 To 20
            If (x Mod i) <> 0 Then
                Exit For
            Else
                If i = 20 Then
                    g = True
                    Exit For
                End If
            End If
            DoEvents
        Next i  
  Loop Until g = True
Debug.Print(x)

VB.net 2008:85 Second

        Dim g As Boolean
        x = 0
        Do
            x += 20

            For i = 1 To 20

                If (x Mod i) <> 0 Then
                    Exit For
                Else
                    If i = 20 Then
                        g = True
                        Exit For
                    End If
                End If

                My.Application.DoEvents()
            Next i
        Loop Until g = True
        Debug.Print(x)

Matlab 6.5: 18 Second

x=0;
g=0;
while (g==0)
    if g==1
        break
    end   
x=x+20;
       for j=1:20
           if mod(x,j) ~= 0
               break
           else    
               if j==20
                   g=1;
                   break                   
               end
           end
       end    

end
x

أرجو من الاخوة التجربة على مترجمات اخرى

أخ Khaled.Alshaya جميل هذا الحل الرياضي :clapping:

تم تعديل هذه المشاركة بواسطة Devd في 19 ديسمبر 2009 في 15:00

1
#5

بعد جهد كبير استطعت تحليل المسالة،،

لو لاحظنا كيف حصلنا على 2520

قمنا بضرب الاعداد من 1-10

وينتج

3628800

ثم قمنا بتقسيمها على

2 ثم 3 ثم 4 ثم 5 ثم6 ثم 2

اذن قمنا بالتقسيم على نصف العدد (10) اي 5 مرات مبتدئين من 2 ثم 3 ثم 4 ثم 5 ثم 6 ثم بعد ذلك نقوم بالقسمة على 2

ولو اردنا ان نقوم بحساب العملية للعدد من 1-20

نقوم بضربهم

وينتج

2432902008176640000

ونقوم بالتقسيم بدءا من 2

ل 10 من المرات اي من ال 2 الى ال 11 ثم بعد ذلك نقوم بتقسيم الناتج على 2

اي

2432902008176640000

على 2 ثم نقسم الناتج على 3 ثم على 4 ثم 5 .... 11

ثم بعد ذلك نقسم الناتج على 2

وينتج العدد

30474662400

والكود سنراه معا


* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

/**
*
* @author mohamed
*/
import java.math.BigInteger;
public class Test4 {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here

if(check(mod(prod())))
System.out.println(mod(prod()).toString());



}

public static boolean check(BigInteger x){
BigInteger y=new BigInteger("1");
BigInteger z=new BigInteger("0");
BigInteger temp=new BigInteger("0");
BigInteger t=x;
boolean b=true;
for(int i=0;i<6;i++){

t= x.mod(temp.add(y));

if(!t.equals(z))
{

b=false;
break;
}
temp=temp.add(y);

}

return b;
}


public static BigInteger prod(){
BigInteger y=new BigInteger("1");
BigInteger x=new BigInteger ("1");
BigInteger temp=new BigInteger("0");
for(int i=0;i<20;i++){
x= x.multiply(temp.add(y));
temp=temp.add(y);

}

return x;
}
public static BigInteger mod(BigInteger x){

BigInteger temp=new BigInteger("1");
BigInteger y=new BigInteger("1");

for (int i=0;i<10;i++){
x=x.divide(temp.add(y));
temp=temp.add(y);
}

return x.divide(y.add(y));
}

}
/*

هذا هو تحليلي للعملية ارجو ان يكون واضحا وصحيحا

تحياتي

run:

30474662400

BUILD SUCCESSFUL (total time: 0 seconds)

using java

net beans

Linux for human beings

#6

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

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

والكود يفسر ذلك باستخدام فيجوال بيسك ويمكنك استخدامة الى الرقم 709

Dim pro As Double

Dim orginal As Integer

Private Sub Command1_Click()

pro = 1

orginal = Val(Text1.Text)

Do

j = Choose(i + 1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997)

If j < orginal Then

pro = pro * j ^ Int((Log(orginal) / Log(j)))

End If

i = i + 1

Loop While i < 168

Label1.Caption = pro

End Sub

اتمنى ان يكون الكود واضحا وبسيطا

Smallest Number.rar

#7

السلام عليكم ورحمة الله

هذه الخوارزميه تقوم بحساب اصغر عدد يقبل القسمة على الاعداد الصحيحة الموجبة من 1 الى max. الفكرة كلها تعتمد على ان اى عدد يمكن تحليله الى حواصل ضرب اعداد اوليه. فمثلا العدد 720 يمكن تحليله الى 2 و 2 و 2 و 2 و 3 و 3 و 5 وجميعها اعداد اوليه. ونلاحظ هنا ان العدد الاولى 2 تم تكراره اربع مرات لان العدد mimetex.cgi?16=2^4 احدى عوامل العدد الاصلى 720. وكذلك العدد 3 ظهر مرتين , لان العدد mimetex.cgi?9=3^2 احدى عوامل العدد 720.

الخلاصه: اى عدد X يمكن تحليله الى حاصل ضرب مجموعة اعداد اوليه , وكل عدد اولى سيظهر مرفوعا لقوة تكافئ اكبر مضاعف لهذا العدد الاولى ويكون من عوامل العدد الاصلى X.

الخوارزميه:

المدخلات: العدد الصحيح الموجب mimetex.cgi?max

المخرجات: اصغر عدد mimetex.cgi?RES يقبل القسمة بدون باقى على جميع الاعداد الصحيحة الموجبة بين العدد 1 و العدد mimetex.cgi?max.

1) ضع العدد mimetex.cgi?RES=1

2) لجميع القيم mimetex.cgi?i=1,2, ...,max قم بتكرار الخطوات من 3 الى 5

3) اذا كان العدد mimetex.cgi?i عددا اوليا قم بتنفيذ الخطوات من 4 الى 5

4) اوجد اكبر قوة mimetex.cgi?p للعدد mimetex.cgi?i بحيث يكون mimetex.cgi?i^{p}\leq max

5) قم بتحديث العدد mimetex.cgi?RES ليكون mimetex.cgi?RES*i^p

6) العودة بالعدد mimetex.cgi?RES

وطبعا هنا فى الخطوة 3 نختبر هل العدد الحالى اولى او لا , ويمكن عمل ذلك بعدة طرق ابسطها استخدام طريقة قسمة العدد mimetex.cgi?i محل الاختبار على جميع الاعداد الصحيحة الموجبة بين 2 الى mimetex.cgi?\sqrt{i}

اتمنى تكون الخوارزميه واضحه , واليكم تطبيقها باستخدام الماتلاب

function RES=EULER5(max)

RES=1;
for i=2:max
    if isprime(i)
        p=1;
        while i^(p+1) <= max
            p=p+1;
        end
        RES=RES*i^p;
    end
end


function r=isprime(num)
r=1;
for i=2:sqrt(num)
    if mod(num,i)==0
        r=0;
        return
    end
end

والخوارزميه تعمل على اى عدد max.

هذا والله اعلى واعلم ,,,

تم تعديل هذه المشاركة بواسطة عماد حمدي احمد في 19 ديسمبر 2009 في 16:44 — السبب: الله اعلى واعلم

1

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

#8

جميل اخى الفاضل fmgret12 تقريبا نفس الفكرة التى اعتمدت عليها انا ايضا , ولكن من اين لك بهذه العلاقه؟

fmgret12 كتب:

pro = pro * j ^ Int((Log(orginal) / Log(j)))

ممكن توضيح لو سمحت؟

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

#9

مسألة جميلة ... عدلت الرد

232792560 هذا رقم يحقق المسألة إستنتجته من العدد الذي حصلت عليه من الخوارزمية المعطوبة :) هو : 12252240 بعد ضربه ب 19 ,

الخوارزمية المعطوبة هي

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long int i,j,k,n;

    for(i=1;i<99999999;i++)
    {
        k=1;
        for(j=1;j<21;j++)
        {
            if((i%j)==0) k++;
        }
        if (k==20)
        {
            n=i;
            goto pr;
        }
    }
goto ex;
    pr:
    printf("%d\n",n);
    ex:
    system("pause");
    return 0;
}

تم تعديل هذه المشاركة بواسطة mouradpr في 20 ديسمبر 2009 في 17:38

#10
عماد حمدي احمد كتب:

جميل اخى الفاضل fmgret12 تقريبا نفس الفكرة التى اعتمدت عليها انا ايضا , ولكن من اين لك بهذه العلاقه؟

ممكن توضيح لو سمحت؟

التوضيح بالصورة المرفقة

post-108462-12613498365246_thumb.jpg

#11

نعم فهمت اخى الفاضل frmgret12 , بارك الله فيك ,,,

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

#12

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

هذه طريقه بلغه السي.

#include <iostream>
using namespace std;
int GCD(int a,int b){return (b==0)? a:GCD(b,a%b);}
int LCM(int a,int b){ return a*b/GCD(a,b);}
int main ()
{
 	int t=2; 
 	for(int i=2;i<10;i++)
 	t=LCM(i,t);
 	cout<<"number ="<<t<<endl; 	
return 0;
}
2
tvquran_6.gif

#13
فهدالشلوي كتب:

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

هذه طريقه بلغه السي.

#include <iostream>
using namespace std;
int GCD(int a,int b){return (b==0)? a:GCD(b,a%b);}
int LCM(int a,int b){ return a*b/GCD(a,b);}
int main ()
{
 	int t=2; 
 	for(int i=2;i<10;i++)
 	t=LCM(i,t);
 	cout<<"number ="<<t<<endl; 	
return 0;
}

بارك الله فيك اخى فهد. لكن ياريت تشرح ما يتم فى الخوارزميه , حتى يسهل فهمها.

الخوارزميات الموجوده كلها عليها تعليقات كثيرة , ولا اعلم اين ذهب الاخ وائل !!!

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

#14

الاخ فهد دائما مبدع، عودية داخل عودية ربنا يستر على المكدس. :happy:

مطلوب منك اخي فهد حساب ال time complexity. :ph34r:

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#15
اقتباس
الخوارزميات الموجوده كلها عليها تعليقات كثيرة , ولا اعلم اين ذهب الاخ وائل !!!

اسف جداً على عدم المتابعة, وذلك بسبب ضغط المشاريع إن شاء الله أحاول التعليق بأسرع وقت ممكن عند توفر الوقت لدي, ما شاء الله عليكم لم اتوقع هذه الحلول و هذه الكفاءات لدينا :)

بارك الله بكم جميعاً, أعود قريباً...

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#16

السلام عليكم

فى البدايه انا عضو جديد راق لى هذا المنتدى بما فيه من مواضيع مميزه واعضاء فعالين اتمنى ان تقبلونى معكم.............

طريقة تفكيرى لحل هذه المساله هى كالتالى :

--بداية من رقم صغير مثل 2 فالعامل المشترك الاصغر له هو 2 ثم بالنسبة لرقمين مثل (2و3) فان الرقم 3 لايقبل القسمة على العامل المشترك الاصغر للرقم 2 وبالتالى فالعامل المشترك الاصغر للاثنين معا هو حاصل ضربهم (2*3=6).

--بالنسبه للرقم 4 فانه لايقبل القسمه على ناتج (2و3) لذا فى الخطوه الثانيه نبحث هل الرقم 4 يقبل القسمه على اى من الاعداد السابقه (2و3) اذا وجدنا اى رقم يقبل القسمه عليه اثناء عملية البحث نوقف البحث ويكون الناتج هو

(الناتج القديم *الرقم الجديد)/العدد الذى يقبل القسمه عليه (وهذا بديهيا لاننا بمجرد ان ضربنا فى الرقم الكبير فلا داعى ان نضرب فى الرقم الصغير الذى يقبل القسمه عليه). اى يساوى هنا (6*4)/2= 12 وبالفعل هذا هو العامل المشترك الاصغر للارقام (2و3و4)

--اما اذا كان لايقبل القسمه على اى رقم من الارقام السابقه مثل الرقم 5 فانه لايقبل القسمه على الناتج وهو 12 ولا على اى رقم سابق (2و3و4) لذ يكون الناتج هو (الناتج القديم * الرقم الجديد).

--اما اذا كان العدد الجديد يقبل القسمه على الناتج فان هذا الناتج يكون هو نفسه العامل المشترك الاصغر لهذا الرقم.

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

### النتيجه بالنسبه للارقام من 2: 10 كان العامل المشترك الاصغر لها هو 2520 && بالنسبه للارقام من 2: 20 كان المعامل المشترك الاصغر لها هو 232792560

وهذا برنامج بلغة السى شارب يمثل هذا الالغورزم :

    class Min
    {
      public static double result = 2;
      public static int Check(int i, double res)
        {
            if (res % i == 0)
                return i;
            for (int j = i-2; j > 1; j -= 2)
            {
                if (i % j == 0)
                    return j;
            }
            return 1;
        }
        static void Main(string[] args)
        {
            for (int i = 3; i < 21; i++)
            {
                result =(result* i) /Check(i,result);     
            }
            Console.WriteLine("Result is  : {0}",result);
            Console.ReadKey();
        }
    }

بالنسبه للداله check فهى باختصار تبحث اذا كان العدد الجديد عدد اولى ام لا لكنها طويله شيئا ما بالنسبه لدالة GCD التى صممها الاخ فهد فاتمنى ان يشرح لنا كيف توصل الى هذا التبسيط.

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

#17

السلام عليكم :

الدالة GCD تستخدم خوارزمية إقليدس للقسمة.

مثلا :العددين 252 و 198 .

252 = 1×198 والباقي : 54

198=3×54 والباقي : 36

54=1×36 والباقي :18

36=2×18 والباقي :0

طبق الكود التالي وسوف تتبع عمل الدالة :

#include <iostream>
using namespace std;

int GCD(int a,int b)
{
     if(b==0) return  a;
      else 
      {
     cout<<"GCD(b,a%b)="<<a%b<<endl;     
     return GCD(b,a%b);
      }
}

int main()
{
cout<<GCD(252,198)<<endl;    
    cin.get();

}

الدالة التاليه LCM دالة المضاعف المشترك الأصغر = حاصل ضرب العددين ÷ القاسم المشترك الاكبر

tvquran_6.gif

#18

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

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

واليكم البرنامج للتجربة

Small_Number.rar

#19

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

لقد لاحظت ان الارقام التي يمكن قسمتها علا 10 تقبل ايضا القسمة على 5,2.. حسب لجدول التالي:

10    :5,2
9     :   3
8      :4,2
7      :   7
6      :3,2

وبدلك فاننا و نستطيع ايجاد العدد المطلوب فقط بالقسمة علا الارقام الخمس (10,9,8,7,6) وبالتالي فانه يقبل القمسة علا الاعداد اسابقة (1.2.3.4.5.6)

وبما اننا في كل مرة نقوم باضافة 10 ل dividend فانه يقبل القسمة علا 10,ادن لم يتبقا لنا سوى 9,8,7,6.

نفس الشيء بالنسبة ل1 >>20

نقلص مجال من 1 >>20 الى 11>>19.

هذه طريقه بلغهassembler masm :


.data
msg byte "The number is :",0
dividend dword 0
i byte 0
.code
main PROC
mov eax,0
incDiv:
mov eax,dividend
add eax,20 ; change 10 by 2520 to make it fast!
mov dividend,eax
mov i,20 ; i the divided, it take the value from 20 to 11
deci:
mov edx,0
mov eax,dividend
cmp i,11 ;if i arrived to eleven the program show the current value of dividend
jbe exitee
dec i
movzx ebx,i
div ebx
cmp edx,0
je deci
jmp incDiv
exitee:
mov edx,offset msg
call writeString
mov eax,dividend
call writeint
exit
main ENDP
END main
Include Irvine32.inc

2520.asm

تم تعديل هذه المشاركة بواسطة Hisokader في 9 يناير 2010 في 23:52

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