我是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逻辑。有没有其他方法/逻辑来解决这个问题?
答案 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的另一个数字的唯一可能输出是9
,8
,1
和0
。或者,来自9
并且数字小于9
的最大结果是9
减去其最低有效位(因此8
)。如果您不确定数字的二进制表示,则可以始终使用bin
函数。例如。 bin(9)
=> '0b1001'
。
让我们从奇数开始(因为它们是最简单的)。奇数很容易,因为它们总是在单位位置有一点点。因此,我们可以获得的最大可能数量是B
减去单位位置中的那个位(因此B - 1
是最大值)。例如,9
表示为1001
。摆脱单位,我们有1000
或8
。 9 and 8 == 8
,因此最大结果为8
。
现在让我们尝试与evens类似的东西。例如,14
表示为1110
。我们可以从另一个数字得到的最大数字是1100
(或12)。与赔率一样,我们必须总是丢失一位,并且可能丢失的最小位是2s位的位。在这里,我们已经成为14
的幸运者已经在2s位置。但那些数字怎么样呢?让我们试试12
(表示为1100
)。如果我们丢失12
中的最小位,我们会1000
或8
。但是,这不是最大可能的。我们可以很容易地证明这一点,因为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
加上一些正数。该负面部分由前导位表示。因此-8
为1000
(-8 + 0
),-1
为1111
(-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);
}