2015-04-19 2 views
-1

Мне была предложена следующая задача: учитывая s и x, вычислить количество решений (a, b), которые удовлетворяют как 1) s = a + b, так и 2) x = a XOR b. Все величины и операции являются целыми.XOR и слишком много итераций?

Example Inputs: 
    s = 10 
    x = 4 
Output: 
    2 

Никакие модули не могут быть импортированы.

Я написал следующие ответы, которые все слишком долго:

Первое:

def answer(s,x): 
    tally = 0 
    z = 0 
    while z <= s: 
     p = s - z 
     q = int(z^p) 
     if x == q: 
      tally += 1 
     z += 1 
    return tally 

Второе:

def answer(s,x): 
    spotlist, forwardlist = range(0,s+1) 
    backwardlist = range(s,-1,-1) 
    tally = 0 
    for spot in spotlist: 
     if x == forwardlist[spot]^backwardlist[spot]: 
      if s == forwardlist[spot] + backwardlist[spot]: 
       tally +=1 
    print tally 

Третье:

def answer(s,x): 
    tally = 0 
    z = 0 
    while z <= s: 
     q = int(z^(s - z)) 
     if x == q: 
      tally += 1 
     else: 
      pass 
     z += 1 
    print tally 

Я думаю, что я» m что-то не хватает или итерации по номерам перед удалением некоторых возможных решений.

+2

Вы, похоже, оставили решающую часть проблемы. Вы не сказали, почему вы итерации. Похоже, проблема заключается не в том, что вы сказали, а в том, что вы должны рассмотреть некоторый диапазон значений. Каков источник этой проблемы? –

+2

Возможный дубликат [С учетом XOR & SUM двух чисел. Как найти номера?] (Http://stackoverflow.com/questions/18732329/given-xor-sum-of-two-numbers-how-to-find-the-numbers) – wldsvc

+0

@ thebjorn имеет [оптимизированное решение к добавлению проблем] (http://stackoverflow.com/questions/11792708/generate-all-possible-combinations-from-a-int-list-under-a-limit); обратите внимание на использование наборов, кеширование и предотвращение дополнительных поисковых запросов: см. дубликат по причинам, по которым SUM и XOR не могут быть выполнены для всех значений. – JGreenwell

ответ

1

Если (a, b) - пара решений, то это также (b, a), поэтому вы можете уменьшить диапазон, который вы проверяете наполовину. Кроме того, вы можете воспользоваться тем, что если x = a^b то b = x^a

Код ниже более чем в два раза быстрее, чем ваш первый answer() функции
с s, x = 10, 4, и более чем в 4 раза быстрее с s, x = 255, 255.

def xorsum(s, x): 
    tally = 0 
    for a in xrange(s//2 + 1): 
     tally += s - a == x^a 
    return 2 * tally 

Эта функция использует тот факт, что в Python False и True имеют числовые значения 0 и 1, соответственно. Выполнение этого происходит быстрее, чем использование теста if и только приращение tally, если тест верен.


Вы могли реализовать xorsum, используя список понимание:

def xorsum_lc(s, x): 
    return 2 * sum([s - a == x^a for a in xrange(s//2 + 1)]) 

но это медленнее, чем выше функции; эквивалентное выражение генератора еще медленнее (как и ожидалось).

+0

Я должен был быть более конкретным, когда спрашивал об этом. Спасибо за приведенный выше код, это значительно ускорило мое время обработки. – avelardi

Смежные вопросы