我正在尝试编写一个允许我提出下面值的脚本。
当某些大于零的整数与它们的转置值
[x + transpose(x)]
相加时,结果是一个只包含奇数位的数字。
例如:54 + 45 = 99 605 + 506 = 1111
我们将这些数字称为人字拖鞋;所以45,54,506和605是触发器。在
x
或transpose(x)
中,零不可接受前导数字 有多少触发器数字低于10亿(10^9)
?
我在伪代码中这样思考:
IF [x+TRANSPOSE(x)] = ODD NUMBERS ONLY
THEN FLIPFLOP = TRUE
HOW MANY FLIPFLOPS <1,000,000,000
然而,我正在努力学习语法。有人可以帮忙吗?我正在尝试用Python做到这一点
答案 0 :(得分:3)
由于需要奇数加偶数才能产生奇数,因此需要使用奇数和偶数来制作触发器。这限制了你需要测试的候选者的数量,以找到所有的触发器&lt; 10 ** 9。
此外,由于触发器对由奇数和偶数组成,其中一个数字必须以奇数开头,另一个必须以偶数开头。
因此,触发器中的偶数必须是
的形式[odd_digits] + [zero_to_nine]*(ndigits-2) + [even_digits]
换句话说,它以奇数开头,以偶数结束,可以是中间的任何数字。
最终even_digit
不能为零,因为奇数触发器不能从零开始。
您只需要生成上述表格的所有候选偶数,因为当您反转数字时,您会得到候选奇数。要做的不仅仅是计算两次相同的触发器。
速度的进一步优化是仅使用整数。没有字符串。通常,int和字符串之间的转换比算术计算需要更多的时间。
import itertools as IT
zero_to_nine = range(10)
even_digits = [2, 4, 6, 8]
odd_digits = [1, 3, 5, 7, 9]
flipflops = 0
for ndigits in range(2, 10):
for digits in IT.product(*(
[odd_digits] + [zero_to_nine]*(ndigits-2) + [even_digits])):
reversed_digits = digits[::-1]
carry = 0
# print('testing {!r}'.format(digits))
for a, z in zip(digits, reversed_digits):
total = a+z+carry
# print('total: {}'.format(total))
if total % 2 == 0:
break
else:
carry = total//10
else:
# print('{!r} + {!r}'.format(digits, reversed_digits))
flipflops += 1
print(flipflops)
产量
304360
大约6分钟。
答案 1 :(得分:0)
我没耐心等待10亿,所以这里有一个例子,最多可达1000个。
odds = set('13579')
for num in range(1,1000):
if not num % 10:
continue
inverse = int(str(num)[::-1])
s = str(num + inverse)
if all(i in odds for i in s):
print('Num: {}, Inverse: {}, Flip: {}'.format(num, inverse, s))
输出
Num: 12, Inverse: 21, Flip: 33
Num: 14, Inverse: 41, Flip: 55
Num: 16, Inverse: 61, Flip: 77
Num: 18, Inverse: 81, Flip: 99
Num: 21, Inverse: 12, Flip: 33
....
Num: 938, Inverse: 839, Flip: 1777
Num: 942, Inverse: 249, Flip: 1191
Num: 944, Inverse: 449, Flip: 1393
Num: 946, Inverse: 649, Flip: 1595
Num: 948, Inverse: 849, Flip: 1797
修改强>
如果您只是想要计数,并且不关心哪些值符合标准
total = 0
odds = set('13579')
for num in range(1,1000):
if not num % 10:
continue
inverse = int(str(num)[::-1])
s = str(num + inverse)
if all(i in odds for i in s):
total += 1
print(total)
答案 2 :(得分:0)
def check_odds(num):
for x in num:
if x not in odds:
return False
return True
for x in xrange(11,1000):
if x%10 != 0:
invert = int(str(x)[::-1])
flip_sum = str(x + invert)
if check_odds(flip_sum):
print "Number: " + str(x) + " Reverse: " + str(invert) + " flip_sum: " + flip_sum
输出:
Number: 12 Reverse: 21 flip_sum: 33
Number: 14 Reverse: 41 flip_sum: 55
Number: 16 Reverse: 61 flip_sum: 77
Number: 18 Reverse: 81 flip_sum: 99
Number: 21 Reverse: 12 flip_sum: 33
Number: 23 Reverse: 32 flip_sum: 55
Number: 25 Reverse: 52 flip_sum: 77
Number: 27 Reverse: 72 flip_sum: 99
Number: 32 Reverse: 23 flip_sum: 55
Number: 34 Reverse: 43 flip_sum: 77
Number: 36 Reverse: 63 flip_sum: 99
Number: 41 Reverse: 14 flip_sum: 55
Number: 43 Reverse: 34 flip_sum: 77
Number: 45 Reverse: 54 flip_sum: 99
Number: 52 Reverse: 25 flip_sum: 77
Number: 54 Reverse: 45 flip_sum: 99
Number: 61 Reverse: 16 flip_sum: 77
Number: 63 Reverse: 36 flip_sum: 99
Number: 72 Reverse: 27 flip_sum: 99
Number: 81 Reverse: 18 flip_sum: 99
Number: 209 Reverse: 902 flip_sum: 1111
Number: 219 Reverse: 912 flip_sum: 1131
Number: 229 Reverse: 922 flip_sum: 1151
Number: 239 Reverse: 932 flip_sum: 1171
................................
..........
如果你想数数:
def check_odds(num):
for x in num:
if x not in odds:
return False
return True
count = 0
for x in xrange(11,1000):
if x%10 != 0:
invert = int(str(x)[::-1])
flip_sum = str(x + invert)
if check_odds(flip_sum):
count += 1
print count