Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算有效数字(或最大公共前缀)_Python_Algorithm_Python 3.x - Fatal编程技术网

Python 计算有效数字(或最大公共前缀)

Python 计算有效数字(或最大公共前缀),python,algorithm,python-3.x,Python,Algorithm,Python 3.x,我正试图找出一种算法,能够确定给定数字范围内最大的公共前缀。我有一个适用于最简单情况的算法。但我对它不满意,它在更困难的情况下崩溃了 其思想是,对于给定的数字范围,打印出与给定长度的所有数字匹配的前缀。例如,如果我们有长度为3的1,它将匹配100-199之间的所有数字 代码中根本不处理或寻址长度,只处理前缀 使用下面的示例进行编码。第三种情况根本不起作用。虽然目前还没有明确的检查,但预计Start总是小于end #!/usr/bin/env python3 def calc_sig_num(s

我正试图找出一种算法,能够确定给定数字范围内最大的公共前缀。我有一个适用于最简单情况的算法。但我对它不满意,它在更困难的情况下崩溃了

其思想是,对于给定的数字范围,打印出与给定长度的所有数字匹配的前缀。例如,如果我们有长度为3的1,它将匹配100-199之间的所有数字

代码中根本不处理或寻址长度,只处理前缀

使用下面的示例进行编码。第三种情况根本不起作用。虽然目前还没有明确的检查,但预计Start总是小于end

#!/usr/bin/env python3

def calc_sig_num(start, end):
    print("Start {} End {}".format(start, end))
    while start[-1] == "0" and end[-1] == "9":
        start = start[:-1]
        end = end[:-1]

    start = int(start)
    end = int(end)

    diff = end - start

    ones_removed = 0
    keep = True
    while True:
        if keep:
            print(start + diff)
        if diff == 0:
            break
        elif (start + diff) % 10 == 0:
            if ones_removed:
                keep = False
                ones_removed = 0
            else:
                start //= 10
                diff //= 10
        else:
            diff -= 1
            ones_removed += 1
            keep = True
    print()

if __name__ == '__main__':
    calc_sig_num("4929310000", "4929319999")
    calc_sig_num("4929312000", "4929312511")
    calc_sig_num("8666361784", "8666362423")

"""
expected ouput

Start 4929310000 End 4929319999
492931

Start 4929312000 End 4929312511
4929312511
4929312510
492931250
49293124
49293123
49293122
49293121
49293120

Start 8666361784 End 8666362423
8666362423
8666362422
8666362421
8666362420
866636241
866636240
86663623
86663622
86663621
86663620
86663619
86663618
866636179
8666361789
8666361788
8666361787
8666361786
8666361785
8666361784
"""

递归是您的朋友:

import os
def calc_sig_num(a, b):
    lcp = os.path.commonprefix([a,b])
    a, b = a[len(lcp):], b[len(lcp):]       # we now have a[0] < b[0]
    if a == "0"*len(a) and b == "9"*len(b): # base case, range is X00.. - X99..
        yield lcp
        return
    da, db = int(a[0]), int(b[0])
    size = len(a) - 1
    for d in range(da, db + 1):  # we iterate over 1 digit prefix extensions
        suffixes = calc_sig_num(a[1:] if d == da else "0"*size,
                                b[1:] if d == db else "9"*size)
        for suffix in suffixes:
            yield lcp + str(d) + suffix
导入操作系统
def calc_sig_num(a、b):
lcp=os.path.commonprefix([a,b])
a、 b=a[len(lcp):],b[len(lcp):]#我们现在有a[0]

这是一个快速而肮脏的实现,所以请容忍我。不过我喜欢认为它有某种优雅;)它应该明确地说明了这个概念。

os.path.commonprefix([“4929310000”,“4929319999”)
->
'492931'
,它适用于最简单的情况,但并没有像我试图做的那样,为开始和结束范围生成最大的公共前缀。对于第一种情况,范围非常有限,很容易计算出最大公共前缀。我不明白。你能举一个
os.path.commonprefix()
失败的例子吗?根据这些例子,我认为他想要的是最小化允许的前缀数量,这些前缀覆盖范围内的所有数字,并且只覆盖范围内的数字。这看起来像是“计费表”中的问题。如果你愿意,你可以看看我的问题,但我怀疑你会有很多乐趣。这一定是我一生中写过的最糟糕的程序之一。对于那些在家里跟随的人,如果你想让它在Python3中工作,请将“xrange”替换为“range”,并确保“ImportOS”