-2

大家好,在stackoverflow!我正在学习 python,需要编写一个程序来检查一个数字是否是自传的。EG:21200 是自传体,因为它有 2 个 0、1 个 1、2 个 2、0 个 3 和 0 个 4。这是我到目前为止所拥有的:

# Autobiographical numbers
a = input("Number: ")
abn = 
if a == abn:
  print(a, "is autobiographical")
else:
  print(a, "is not autobiographical")

如您所见,我已将 abn 变量打开,因为我不知道该怎么做。我想我必须用 len(a) 确定 a 的长度,然后使用类似的东西

[x[::1] for x in b]

但我不太确定,因为我对 python 很陌生。谢谢,python 上的一个 no0b。

4

4 回答 4

1

我使用下面的代码来测试它。应该有更好的解决方案。

from collections import Counter
def test(x):
    if len(x) > 10:
           return False
    c = Counter(x)
    for i, v in enumerate(x):
            if int(v) != c.get(str(i), 0):
                    return False
    return True

a = input('number: '): #2.x use raw_input
if test(a):
    print(a, 'is')
else:
    print(a, 'is not')

演示:

>>> auto
['1210', '2020', '21200', '3211000', '42101000']
>>> map(test, auto)
[True, True, True, True, True]

>>> auto = ['12321', '13213', '134', '1231', '123124543']
>>> map(test, auto)
[False, False, False, False, False]

来自 wiki 的更好的解决方案:

>>> def isSelfDescribing(n):
        s = str(n)
        return all(s.count(str(i)) == int(ch) for i, ch in enumerate(s))
于 2013-08-06T08:02:08.637 回答
1

正如 Dmitry所说,Rosettacode 有答案:自描述数字

def isSelfDescribing(n):
    s = str(n)
    return all(s.count(str(i)) == int(ch) for i, ch in enumerate(s))

我的解决方案如下(尽管速度较慢):

from collections import Counter
def isAutobiographical(n):
    digits = map(int, str(x))
    actualFrequency = Counter(digits)
    claimedFrequency = dict((x,y) for x,y in enumerate(digits) if y > 0)
    return actualFrequency == claimedFrequency
于 2013-08-06T08:11:57.997 回答
0
import math

b = int(math.log(a,10))

*b is length of a. i.e., number of digits in a*

*in fact there is another tick:*

b = len(str(a))

*of course you need to check if a is a valid natural number*
于 2013-08-06T08:05:55.547 回答
0
>>> def is_autobiographical(n):
    s = str(n)
    count_digits = ''.join([str(s.count(str(i))) for i in range(len(s))])
    return s == count_digits

>>> is_autobiographical(21200)
True
>>> is_autobiographical(22)
False

在您的情况下,您可以使用它abn = ''.join([str(str(a).count(str(i))) for i in range(len(str(a)))])来满足您的需求。

于 2013-08-06T08:15:01.340 回答