在Python中查找两个数字之间的AND最大值

时间:2016-11-28 10:56:17

标签: python logical-operators

我是Python编码的初学者。我有两个来自用户的数字A和B.

我的问题是找到 max(P AND Q),其中A< = P< Q< = B

我现在有两个解决方案。

解决方案1 ​​:#ANDing与所有组合,如果组合较少,此解决方案有效。对于更高的值,它会导致内存超出错误。

http://www.example.com/project1#document_1

解决方案2 :观察多个输入输出后,当B == Odd,max(值)= B-1且B ==偶数时,max(值)= B-2。

given = raw_input()
n= list(map(int,given.split()))

A = n[0]
B = n[1]

newlist = range(B+1)
# print newlist

# Finding all combinations
comb = list(itertools.combinations(newlist,2))
# print comb

# ANDing 
l = []
for i in com:
    x = i[0] & i[1]
    l.append(x)
# print l

print max(l) 

根据问题陈述,我没有对解决方案2使用任何ANDing。我仍然得到正确的输出。

但我正在寻找更容易和Pythonic逻辑。有没有其他方法/逻辑来解决这个问题?

3 个答案:

答案 0 :(得分:1)

我认为这应该有效:

given = raw_input()
a, b = tuple(map(int,given.split()))
print(max([p & q for q in range(a,b+1) for p in range(a,q)]))

答案 1 :(得分:1)

您的第二个解决方案是最佳解决方案。但为什么?首先,考虑对数字的二进制表示执行逻辑AND,并且只能生成小于或等于AND运算符的最小操作数的数字。例如,9表示为1001,并且没有9可以使用的数字产生高于9的数字。实际上,使用9的另一个数字的唯一可能输出是9810。或者,来自9并且数字小于9的最大结果是9减去其最低有效位(因此8)。如果您不确定数字的二进制表示,则可以始终使用bin函数。例如。 bin(9) => '0b1001'

让我们从奇数开始(因为它们是最简单的)。奇数很容易,因为它们总是在单位位置有一点点。因此,我们可以获得的最大可能数量是B减去单位位置中的那个位(因此B - 1是最大值)。例如,9表示为1001。摆脱单位,我们有100089 and 8 == 8,因此最大结果为8

现在让我们尝试与evens类似的东西。例如,14表示为1110。我们可以从另一个数字得到的最大数字是1100(或12)。与赔率一样,我们必须总是丢失一位,并且可能丢失的最小位是2s位的位。在这里,我们已经成为14的幸运者已经在2s位置。但那些数字怎么样呢?让我们试试12(表示为1100)。如果我们丢失12中的最小位,我们会10008。但是,这不是最大可能的。我们可以很容易地证明这一点,因为11的最大值是10(因为我们已经显示奇数的最大值是奇数减去1)。

我们已经证明,可以通过两个不同的数字产生的最大数字是数字越大,最不重要的数字。因此,如果该位的值为2(在14的情况下),那么我们可能会丢失该位。如果该位的值大于2(在12的情况下),那么我们知道最大值是小于B的最大奇数的最大值(比奇数小1)并且小于B)。

所以我们拥有它。奇数的最大值是小于1的数字。偶数的最大值是小于2的数字。

def and_max(A, B): # note that A is unused
    if B & 1: # has a bit in the 1 position (odd)
        P, Q = B - 1, B
    else:
        P, Q = B - 2, B - 1
    # print("P = ", P, "Q = ", Q)
    return P & Q # essentially, return P

请注意,这些都不包括负数。这是因为大多数负数的表示都在two's complement。这意味着所有负数都表示为常数负数加上正数。例如,使用整数的4位表示,最大可能的数字将是0111(或7,4 + 2 + 1)。负数将表示为-8加上一些正数。该负面部分由前导位表示。因此-81000-8 + 0),-11111-8 + 7)。这是重要的部分。只要你有-1,就会有一个全1的位掩码,当用正数表示时,它会保证失去负面部分。因此max(P and Q)的最大值A <= P < Q <= B and A < 0始终为B。在B < 0的情况下,我们不能再丢失负位,因此必须再次最大化正位。

答案 2 :(得分:0)

    long a,b,c,ans;
    for(int i=0;i<n;i++){
        a=s.nextLong(); 
        b=s.nextLong(); 

          if(b%2==0)
          ans=b-2;
          else
          ans=b-1;   

         if(ans>=a)   
         System.out.println(ans);
         else
         System.out.println(a&b);

    }