有多少倒数仅等于10亿以下的奇数

时间:2014-11-14 19:49:54

标签: python math

我正在尝试编写一个允许我提出下面值的脚本。

  

当某些大于零的整数与它们的转置值[x + transpose(x)]相加时,结果是一个只包含奇数位的数字。
  例如:

54 + 45 = 99 
605 + 506 = 1111
     

我们将这些数字称为人字拖鞋;所以45,54,506和605是触发器。在xtran‍‍spose(x)‍‍‍‍中,零不可接受前导数字   有多少触发器数字低于10亿(10^9)

我在伪代码中这样思考:

IF [x+TRANSPOSE(x)] = ODD NUMBERS ONLY
THEN FLIPFLOP = TRUE

HOW MANY FLIPFLOPS <1,000,000,000

然而,我正在努力学习语法。有人可以帮忙吗?我正在尝试用Python做到这一点

3 个答案:

答案 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