• 0
Khaled Alshaya

لغز العدد الضائع!

سؤال

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

تصور أن لدينا متتابعة على الشكل التالي:

n, n+1, n+2, ..., n+i

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

ملاحظات لتسهيل كتابة الخوارزمية:

أولاً, افترض أن الأعداد المدخلة لا تقل عن عددين. فليس هناك داع للتحقق من وجود عددين فأكثر.

ثانياً, افترض أن أطراف المتتابعة لم يتم المساس بها, بالتالي فإن العنصرين n و n+i دائماً حاضران ضمن مدخلات الخوارزمية.

ثالثاً, و هذه الملاحظة تتبع من الملاحظة الثانية, أن العدد الضائع أو لنقل العدد الذي تم نزعه هو عدد من منتصف المتتابعة. بالتالي لو سميناه n+k فإن k لابد أن تحقق الشرط التالي:

0 < k < i

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

ما يلي عبارة عن أمثلة على مدخلات البرنامج و مخرجاته(العدد الضائع)...


Example 1:

Input: 1 3
Ouput: 2


Example 2:

Input: 3 1
Ouput: 2


Example 3:

Input: 9 6 7 5 2 3 1 8
Ouput: 4


Example 4:

Input: 99 96 91 95 93 98 89 97 92 94 100
Ouput: 90

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

تحياتي :)

تم تعديل بواسطه Khaled.Alshaya
3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

26 إجابة على هذا السؤال .

  • 0

السلام عليكم

تابعت هذا الموضوع من بداية طرحه ولكن لماذا تم استخدام المجموع بالنسبة للطرق البرمجية ؟

لماذا لم نستخدم طريقة مثل الطريقة التالية بلغة C# :

            List<int> nums=new List<int>();
string n=Console.ReadLine();

while (n!="")
{
nums.Add(Convert.ToInt32(n));
n = Console.ReadLine();
}

nums.Sort();
int ans = 0;

foreach (int ns in nums)
{
if (!nums.Contains(ns+1))
{
ans = ns + 1;
break;
}
}

Console.WriteLine(ans);

بدأت أشك في الطريقة التي أفكر بها بعد أن رأيت ردود الخبراء في ذلك :)

أتمنى توجيهي في هذه المسألة ولكم جزيل الشكر

ملاحظة : الكود السابق يطلب من المستخدم ادخال سلسلة من الأرقام وعندما ننتهي نضغط على Enter بدون كتابة أي رقم أو حرف ليقوم الكود بإيجاد الرقم المفقود ، طبعا افترضت كما هو مطلوب أن المدخل سيكون سلسلة صحيحة و أرقام ولا يعبث المستخدم بإدخال حروف :)

تم تعديل بواسطه hfsh80
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .