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

البحث عن عدد فردي

بدأه caballero في 11 ديسمبر 2009 · 15 رد · 1,625 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

مسألة اليوم متوسطة الصعوبة. ولا يمكن حلها بالآلة الحاسبة.

الحلول الرياضية والبرمجية مقبولة.

نختار 10 أعداد متتابعة، مثلا من 6 إلى 15، ونحسب جداءها (حاصل ضربها) :

mimetex.cgi?6\times 7\times ... \times 1

نجد أن أول رقم يخالف الصفر، بدءا من اليمين، هو 4. رقم زوجي.

نختار 10 أعداد أخرى متتابعة، مثلا من 25 إلى 34:

mimetex.cgi?25\times 26\times ... \times

نجد أن أول رقم يخالف الصفر، بدءا من اليمين، هو 2. رقم زوجي أيضا.

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

السؤال: إبحث عن متتالية من 10 أعداد متتابعة (صحيحة وموجبة) وتكون أصغر ما يمكن، حيث يكون أول رقم يخالف الصفر من جداءها، بدءا من اليمين، رقما فرديا.

إذا كنت تظن بأن هذه المتتالية غير موجودة، أجب بـ "المسألة مستحيلة" مع توضيح السبب. إذا عثرت على حل يحقق كل الشروط، أرسله لي على الخاص، وأكتب ردا هنا تذكر فيه إرسالك للإجابة.

سأعلن النتائج يوم الأحد.

بالتوفيق،، : )

2

MPSI/MP* - CPR Tanger

#2

لا يوجد حل !!

تم الإرسال على الخاص

شكراً على هذه المسألة المنشطة للعقل !

#3

برمجيا ومنطقيا وخوارزميا الحل صحيح عندي تمام التمام لكن عند تطبيق المتتالية العددية على الالة الحاسبو يصبح الجواب خطأ ولكن عند تطبيق متتالية عددية على البررنامج بمقدار اقل يكون الجواب صحيح على الالة والبرنامج !!

أمر غريب عموما ساقوم بارسال الحل اليك وارجو ان كان فيه خطأ ان تبينه لي بعد كشف الحل

تحياتي

Linux for human beings

#4

الأخ الكريم Speed_Of_Light

الأخ الكريم Dev:MOH-TAHA

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

رجاء تفقدا رسائلكما الخاصة.

للتوضيح فقط،، قلت في البداية بأنه لا يمكن حل المسألة بالآلة الحاسبة، لأنها لا تظهر سوى بضعة أرقام: 8 أو 10 أو ... لذلك ستعطي نتائج غير دقيقة عند التعامل مع أعداد كبيرة. Excel أيضا غير مناسب.

تلميح لحل رياضي:

يمكن أن نحصل على رقم فردي إذا إستطعنا التخلص من mimetex.cgi?2^n الموجودة في تفكيك العدد إلى جداء عوامل أولية.

ماذا يساوي n في حالة جداء (حاصل ضرب) 10 أعداد متتالية؟ وهل توجد طريقة "لإبتلاع" mimetex.cgi?2^n ؟

3 عمليات حسابية فقط ستفي بالغرض.

بالتوفيق،،

تم تعديل هذه المشاركة بواسطة caballero في 12 ديسمبر 2009 في 15:47 — السبب: إضافة توضيح

1

MPSI/MP* - CPR Tanger

#5

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

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

bnr025.gif

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

#6

استخدمت مكتبة ما , ولم استطيع ايجاد هذه المجموعه.

ارسلت لك حل شبه رياضى :)

تم تعديل هذه المشاركة بواسطة عماد حمدي احمد في 12 ديسمبر 2009 في 18:43 — السبب: الجملة الاخيرة

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

bnr025.gif

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

#7

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

لقد توصلت لحل للمسألة وتم ارساله عبر الرسائل الخاصة

بالتوفيق للجميع

Linux for human beings

#8

السلام عليكم

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

لن يتم ارسال البرنامج إلا اذا تم السماح بذلك وقد تم ارسال بعض الحلول

تم تعديل هذه المشاركة بواسطة fmgret12 في 12 ديسمبر 2009 في 20:59

#9

تم إيجاد حل !

#10

يبدو وصلت متأخر ........

#11

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

الحل المطلوب:

متتالية الأعداد من 78117 إلى 78126

من توصل للحل حسب الترتيب الزمني:

Dev:MOH-TAHA

Speed_Of_Light

عماد حمدي احمد

أشكركم على المشاركة.. وأرجو منكم أن تضعوا في هذا الموضوع طريقة توصلكم للحل، حتى تعم الفائدة.

الحل الرياضي:

ينتهي العدد المطلوب بعدة أصفار على اليمين. إذن يمكن تعميله إلى

mimetex.cgi?2^a \times 5^b \times p

حيث p هو جداء (حاصل ضرب) أعداد أولية مختلفة عن 2 و 5.

إذن بالضرورة سيكون p فرديا، لأنه جداء أعداد فردية.

حتى يكون أول رقم يخالف الصفر بدءا من اليمين رقما فرديا، يجب أن تكون b، درجة 5، أكبر من أو تساوي a، درجة 2.

بهذا سنضمن أن كل 2 ستقابلها 5 كي نحصل على 0 في نهاية العدد.

في كل متتالية من 10 أعداد صحيحة متتابعة، يوجد على الأقل مضاعف واحد لـ 8، ومضاعف واحد لـ 4، و ثلاثة مضاعفات لـ2.

وبالتالي، درجة 2 ستكون على الأقل هي 3+2+1+1+1=8

من جهة أخرى، في كل متتالية من 10 أعداد صحيحة متتابعة، يوجد مضاعفان لـ 5.

إذن، متتالية الأعداد التي نبحث عنها ستضم بالضرورة مضاعفا لـ mimetex.cgi?5^7 (سنحصل على الـ 5 الثامنة من المضاعف الثاني). والأصغر هو mimetex.cgi?5^7=78125

نبحث عن أصغر متتالية تضم هذا العدد. نبدأ بـ mimetex.cgi?78125-9=78116 حتى mimetex.cgi?78125. سنجد

p><p>

والذي لا يحقق الشرط المطلوب. ننتقل إلى mimetex.cgi?78125-8=78117 حتى mimetex.cgi?78126، سنجد:

p><p>

وبالفعل، أول رقم يخالف الصفر، بدءا من اليمين، هو 9، رقم فردي.

بالتوفيق للجميع،،

تم تعديل هذه المشاركة بواسطة caballero في 13 ديسمبر 2009 في 14:39

2

MPSI/MP* - CPR Tanger

#12

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

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

برنامجى بالماتلاب , وكل الفكرة اننى استهدف العدد mimetex.cgi?5^n بقيم مختلفه للعدد n , ومنه اقوم بتوليد كل مجموعات الاعداد الصحيحة التى تحتوى 10 اعداد متتاليه من ضمنها العدد المستهدف. وبعد ذلك اقوم بحساب حاصل ضرب مجموعة الاعداد المتولده لدينا , ومنها اقوم بالتخلص من جميع الاصفار على يمين العدد , ثم اختبر هل اول رقم -فى الناتج الجديد- فردى ام زوجى. لو كان زوجى نواصل حتى تنتهى جميع المجموعات التى تحتوى العدد المستهدف. ومن ثم اقوم بزيادة العدد n واعود واكرر نفس العمليه. وعند الحصول على اول مجموعة اعداد تحقق المطلوب سيتوقف البرنامج ويعود بهذه المجموعه وحاصل ضربها.

فى الحقيقه كنت اثناء التشغيل ابدأ ب n=5 على اساس انه يوجد فى المجموعه 5 اعداد زوجيه وبالتالى على الاقل الرقم 2 سيتكرر على الاقل 5 مرات. وكنت احصل على الناتج الذى وضعه الاخ caballero. ولكن بعد قراءتى لحله , يمكننا بدأ عملية البحث من العدد n=7 لاختصار الوقت والحسابات.

هذا هو الكود بالماتلاب , حاولت اضعه منسق مثل الماتلاب , الا ان محرر النصوص الجديد فى المنتدى صعب التعامل معه للاسف. ولذلك وضعته ككود عادى

function [TargetSet,Product]=OddNum(n)

% نبدأ بتعريف اول عدد سيتم استهدافه اعتمادا على n

TargetNum=5^n;

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

while n <= 50
    for i=1:10   

        %لا حظ هنا استخدام المكتبة vpi وذلك ليتمكن الماتلاب من التعامل مع
        %الاعداد الصحيحة الكبيرة جدا.

        TargetSet=vpi([TargetNum-9:TargetNum]);

        %نقوم بحساب حاصل ضرب الاعداد العشرة

        Product=prod(TargetSet);

        %نضع حاصل الضرب فى متغير مؤقت لاجراء العمليات الحسابيه عليه

        tempProduct=Product;

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

        while mod(tempProduct,10)==0
            tempProduct=tempProduct/10;
        end

        % وهنا نقوم باختبار هل اول رقم بعد غير صفرى فردى ام زوجى
        % لو كان زوجى سيستمر البرنامج لتوليد مجموعة اعداد جديده
        % اما لو كان فردى , فسيتوقف البرنامج ويعود بمجموعة الاعداد وحاصل
        % الضرب

        if mod(tempProduct,2)==1
            return            
        end
        TargetNum=TargetNum+1;
    end

    % تحديث عدد مرات ظهر الرقم 5 للبحث فى جوار جديد

    n=n+1;
    TargetNum=5^n;
end

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

تم تعديل هذه المشاركة بواسطة عماد حمدي احمد في 13 ديسمبر 2009 في 15:48 — السبب: تعديل

2

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

bnr025.gif

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

#13

الجافا ،، لا حدود للابداع


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

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

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
boolean b=false;
BigInteger x=new BigInteger("1");// المتغير الذي سيتم فحصه دوريا
BigInteger y=new BigInteger("1");// بهدف الطباعة عند الوصول للناتج
BigInteger z=new BigInteger("9");// بهدف الطباعة عند الوصول للناتج
while(!b){
b=check(prod(x));// بدء الفحص

x=x.add(y);// الزيادة على العدد حيث يبدا الفحص من قيمة 1-10 ثم من 2-11 وهكذا





}
x=x.subtract(y); // الى نهاية الميثود هدف طباعي عند التوصل للناتج
System.out.print("from"+(x.toString()));
x=x.add(z);

System.out.println("to .."+(x.toString()));



}

public static BigInteger prod(BigInteger x){ // دالة تاخذ الرقم وتضربه بال 9 اعداد التي تليه
BigInteger y=new BigInteger("1");

BigInteger temp=x;
for(int i=0;i<9;i++){
x= x.multiply(temp.add(y));
temp=temp.add(y);

}

return x;
}

public static boolean check(BigInteger lng){ // دالة تقوم باخذ الناتج من الدالة السابقة والقحص عن العدد الفردي

StringBuilder str=new StringBuilder();
str.append(lng);
char c=' ';
int a=0;

for(int i=str.length()-1;i>0;i--){
c=str.charAt(i);
a=Integer.parseInt(Character.toString(c));

if(a==0){
// do no thing
}else{
if(a%2==1){

return true;
}
else{return false;}

}

}

return false;
}

}
/*

1

Linux for human beings

#14
Dev:MOH-TAHA كتب:

الجافا ،، لا حدود للابداع

اخى الفاضل كده كم الحسابات كبير جدا :)

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

bnr025.gif

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

#15

صحيح ،، لكن بما اني لست محب لمادة الرياضيات فضلت البدء من ال 1

Linux for human beings

#16
اقتباس
لست محب لمادة الرياضيات فضلت البدء من ال 1

انتبه اخي ،من الادوات التي تحدد كفاءة اي برنامج : زمن البرنامج وحجم البرنامج. و هما المحور الاساسي لنظرية الخوارزميات .

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

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