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

سلسلة شغل مخك

مغلق
بدأه bashmohandes في 24 فبراير 2006 · 10 رد · 3,470 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مساهمة مني في اعادة الروح الى السلسلة هذا سؤال بسيط و حله في سطر واحد فقط

اذا كان عندك متغير X كيف تعرف أن X على الصورة 2 اس n يعني على الصورة 2 , 4 , 8 , 16 , 32 , .... الخ

الحل بسيط للغاية و في سطر واحد

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#2
if  math.log(x,2) % 2 ==0 then yes else no

جواب على السريع!

لو كان صحيح، احذف هذه المشاركة حتى يتسنى للأعضاء المشاركة!

#3

اذا كان فيه بت واحد فقط 1 و البقية 0 أصفار .. (بغض النظر عن تمثيل الاعداد السالبة .. )

لكن كيف تعرف ذلك بسطر واحد؟

#4

ذا كان العـدد مثلاً يساوي 1000 فبالإمكان عكسـه إلى 0111 .. وبإهمال الصفر الأخير فبالإمكان عكسه مرة أخرى إلى 0000 .. وبالتالي أي عدد بعد هذه الخطوات يساوي الصفر فهـو المطلوب .... لم أفكر مطولاً فيه ..

#5

لقد اقتربت جداً يا سلطان من الحل

حاول أكثر

الحل أبسط من هذا يا أبو مازن فالعملية باستخدام الlog مكلفة جداً

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#6
for(int i=0; i <=x; i <<=1) result = (i==x) ? true:false;

معرفش الحل ده ينفع ولا لاء

اقتباس
if  math.log(x,2) % 2 ==0 then yes else no

أخي ابومازن log(x,2) المفروض انها ترجع n , ليس شرط أن تقبل n القسمة على 2 بينما يجب أن تكون عدد صحيح وليست كسر

يعني ممكن نكتبها بهذا الشكل

result = ( log(x,2) == static_cast<float>( static_cast<int>(log(x,2) ) ) ? true: false;
#7

هممم لا أدري لكن هذا حل آخر مستنبط من حل سلطان:

if Integer.toBinaryString(i).indexOf("1", 1)==-1 then YES ELSE NO

وحلي الأول لم يناقش بعد:

if (Log(x)/Log(2)%2==0) Then Yes Else No
#8

على العموم الحل بسيط و يأتي من الحقيقة التي ذكرها سلطان و هي أن الأعداد التي تتبع القاعدة 2 أس n مثل 2, 4, 8, 16 ... تشترك في الخاصية التالية

من الأمثلة التالية سيتضح الموضوع

00000001 العدد 1 و هو 2 أس 0

00000010 العدد 2 و هو 2 أس 1

00000100 العدد 4 و هو 2 أس 2

00001000 العدد 8 و هو 2 أس 3

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

و الفكرة هي عن طريق اكتشاف هذه الأصفار على يمين الرقم و لكن لاكتشافها سنحتاج لأرقام على هذا الشكل

00000000 و هو الرقم صفر

00000001 و هو الرقم 1

00000011 و هو الرقم 3

00000111 و هو الرقم 7

أي أنها الأرقام التي تسبق الرقم X بواحد دائماً أي أنها X-1

اذا الحل بسيط عن طريق عمل AND بين X و X-1 فإذا كان الناتج صفر اذن الرقم يتبع 2 اس n اما اذا كان الناتج 1 فانه غير ذلك

و هكذا يكون الحل

if ((x & (x-1)) ==0)
{
}
else
{
}

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#10

فعلا دي احسن طريقة لعمل الموضوع ده

أنا فاكر إني شفتها في كتاب من فترة بس مش فاكر إسمه

#11

آه .. وأنا كنت أدور حول نفس هذه الفكرة .... وفي الأخير تطلع بكل هذه البساطـة ...

حل مبدع صراحـة

هذا الموضوع مغلق.

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