مسألة برمجية للتدريب (تحتاج معرفة Binary)

  • Rashadoo

المشكلة تقول كالتالي:

سأعطيك رقمين n , m يمكن من 1 الى 10 قوة 18 .. اريد عدد الارقام التي بينهما (معهما) التي تحوي في تمثيلها الثنائي (الباينري) صفراً واحداً


مثال على الدخل :

n = 5

m = 10

الخرج : 2

لان 5 = 101

و 6 = 110

وباقي الارقام الى عشرة تحوي اكثر من صفر او لا تحوي اصفاراً ابداً


مثال ثاني:

2015 2015

الخرج : 1


مثال اخير :

72057594000000000 72057595000000000

الخرج : 26


لغة روبي , xmax المدخل الاكبر , xmin المدخل الاصغر

سرعة .. O(log2(m)) بحيث m المدخل الاكبر

اداء الذاكرة O(1)

إن شاء الله يكون الحل صحيح

xmax = 6
xmin = 5

startRange = Math.log2(xmin).ceil
endRange = Math.log2(xmax).ceil

biggestNumber = (2**endRange)-1
smallestNumber = (2**startRange)-1

count  = 0
powerNumber = 1

for i in 0...(endRange-1)
    bnumber = biggestNumber-powerNumber
    snumber = smallestNumber-powerNumber


    if ((bnumber <= xmax and bnumber >= xmin) or 
         (snumber <= xmax and snumber >= xmin))
        count += 1
    end
    powerNumber = powerNumber * 2
end


puts "Result: #{count}"