提示是
给定整数A和B,它们具有相同的位数,并且没有前导零,那么有多少个不同的加扰对(i,j)满足:A
例如,如果我们让A = 10且B = 99,则答案为36:
(12,21), (13,31), (14,41), (15,51), (16,61), (17,71), (18,81), (19,91), (23,32), (24,42), (25,52), (26,62), (27,72), (28,82), (29,92), (34,43), (35,53), (36,63), (37,73), (38,83), (39,93), (45,54), (46,64), (47,74), (48,84), (49,94), (56,65), (57,75), (58,85), (59,95), (67,76), (68,86), (69,96), (78,87), (79,97), (89,98)
这是我的代码:
import random
import itertools
A = input("Enter integer with no leading zero:")
B = input("Enter integer greater than A with no leading zero:")
A=int(A)
B=int(B)
realArray = []
myArray = []
temparray = []
heyArray = []
count = 0
totalcount = 0
printcount = 0
x = 0
def checkArray(myArray):
global x
global temparray
for i in myArray:
x = int(i)
if x not in temparray:
temparray.append(x)
def allcombos(li):
global count
global myArray
global realArray
global heyArray
global temp
global printcount
global A
global B
for subset in itertools.permutations(li, len(li)):
s = ''.join(map(str, subset))
if int(s) in range(A,B):
myArray.append(int(s))
if len(myArray)> 1:
checkArray(myArray)
myArray = []
def scrambleint(i):
i_string = str(i)
li = list (map(int, i_string))
allcombos(li)
def main():
for i in range(A, B):
scrambleint(i)
print (temparray)
print(len(temparray))
main()
我现在的输出是89
[10, 11, 12, 21, 13, 31, 14, 41, 15, 51, 16, 61, 17, 71, 18, 81, 19, 91, 20, 22, 23, 32, 24, 42, 25, 52, 26, 62, 27, 72, 28, 82, 29, 92, 30, 33, 34, 43, 35, 53, 36, 63, 37, 73, 38, 83, 39, 93, 40, 44, 45, 54, 46, 64, 47, 74, 48, 84, 49, 94, 50, 55, 56, 65, 57, 75, 58, 85, 59, 95, 60, 66, 67, 76, 68, 86, 69, 96, 70, 77, 78, 87, 79, 97, 80, 88, 89, 98, 90]
我想删除列表中没有加扰数字的数字(例如10和11)。 (例如,加扰10的唯一方法是01,它不在A = 10到B = 99的范围内)。任何帮助表示赞赏,谢谢!
最佳答案
您的问题看起来像是作业,但这是一条可以产生所需结果的衬里:
from itertools import combinations
A = 10
B = 99
scrambled_pairs = [pair for pair in combinations(range(A, B+1), 2)
if pair[0] == (pair[1]%10*10 + pair[1]/10)]
>>> scrambled_pairs
[(12, 21), (13, 31), (14, 41), (15, 51), (16, 61), (17, 71), (18, 81), (19, 91), (23, 32), (24, 42), (25, 52), (26, 62), (27, 72), (28, 82), (29, 92), (34, 43), (35, 53), (36, 63), (37, 73), (38, 83), (39, 93), (45, 54), (46, 64), (47, 74), (48, 84), (49, 94), (56, 65), (57, 75), (58, 85), (59, 95), (67, 76), (68, 86), (69, 96), (78, 87), (79, 97), (89, 98)]
>>>> len(scrambled_pairs)
36
所有要做的就是迭代A和B的所有可能组合,并选择
pair[0]
是pair[1]
的“反向”的那些对。注意:这显然是为您的特定示例量身定制的。对于更通用的解决方案,请更改列表理解中的过滤器/条件,以一般性地检测加扰对,例如:
from itertools import combinations, permutations
def is_scrambled_pair(a, b):
return tuple(str(a)) in permutations(str(b))
A = 10
B = 99
scrambled_pairs = [pair for pair in combinations(range(A, B+1), 2)
if is_scrambled_pair(*pair)]
>>> len(scrambled_pairs)
36
>>> scrambled_pairs
[(12, 21), (13, 31), (14, 41), (15, 51), (16, 61), (17, 71), (18, 81), (19, 91), (23, 32), (24, 42), (25, 52), (26, 62), (27, 72), (28, 82), (29, 92), (34, 43), (35, 53), (36, 63), (37, 73), (38, 83), (39, 93), (45, 54), (46, 64), (47, 74), (48, 84), (49, 94), (56, 65), (57, 75), (58, 85), (59, 95), (67, 76), (68, 86), (69, 96), (78, 87), (79, 97), (89, 98)]
A = 100
B = 999
scrambled_pairs = [pair for pair in combinations(range(A, B+1), 2)
if is_scrambled_pair(*pair)]
>>> len(scrambled_pairs)
1701
>>> scrambled_pairs[:100]
[(101, 110), (102, 120), (102, 201), (102, 210), (103, 130), (103, 301), (103, 310), (104, 140), (104, 401), (104, 410), (105, 150), (105, 501), (105, 510), (106, 160), (106, 601), (106, 610), (107, 170), (107, 701), (107, 710), (108, 180), (108, 801), (108, 810), (109, 190), (109, 901), (109, 910), (112, 121), (112, 211), (113, 131), (113, 311), (114, 141), (114, 411), (115, 151), (115, 511), (116, 161), (116, 611), (117, 171), (117, 711), (118, 181), (118, 811), (119, 191), (119, 911), (120, 201), (120, 210), (121, 211), (122, 212), (122, 221), (123, 132), (123, 213), (123, 231), (123, 312), (123, 321), (124, 142), (124, 214), (124, 241), (124, 412), (124, 421), (125, 152), (125, 215), (125, 251), (125, 512), (125, 521), (126, 162), (126, 216), (126, 261), (126, 612), (126, 621), (127, 172), (127, 217), (127, 271), (127, 712), (127, 721), (128, 182), (128, 218), (128, 281), (128, 812), (128, 821), (129, 192), (129, 219), (129, 291), (129, 912), (129, 921), (130, 301), (130, 310), (131, 311), (132, 213), (132, 231), (132, 312), (132, 321), (133, 313), (133, 331), (134, 143), (134, 314), (134, 341), (134, 413), (134, 431), (135, 153), (135, 315), (135, 351), (135, 513), (135, 531)]