0

由于某种原因,下面的输出结果为 0。我正在使用一个非常大的字符串(100,000 个字符),并在寻找一个大整数,以千亿为单位,例如 500,000,000,000。我有什么特别需要做的吗?目标是在 pi 的前 100,000 位中找到 1,2,3 的子序列数。我知道以下在算法上是正确的。它只是不“代码正确”。

pi100k = "3.14159[100,000 digits of pi]"
subSeqInit = 0
subSeqPair = 0
subSeqTotal = 0

for c in pi100k:
    if c == 1:
        subSeqInit = subSeqInit + 1
    elif c == 2 and subSeqInit > 0:
        subSeqPair = subSeqPair + 1
    elif c == 3 and subSeqTotal > 0:
        subSeqTotal = subSeqTotal + 1

print(subSeqTotal)
4

3 回答 3

4

最简单最快的方法大概是这样的:

subSeqTotal = pi100k.count("123")
于 2011-06-01T02:02:32.493 回答
3
pi100k = "3.14159[100,000 digits of pi]"
subSeqInit = 0
subSeqTotal = 0

for c in pi100k:
    if c == '1':
        subSeqInit = 1
    elif c == '2' and subSeqInit == 1:
        subSeqInit = 2
    elif c == '3' and subSeqTotal == 2:
        subSeqTotal = subSeqTotal + 1
        subSeqInit = 0

print(subSeqTotal)

Python 不会将字符串字符隐式转换为整数。此外,您的算法不健全,我上面的内容会更好。

编辑:

您可以通过使用正则表达式模块来缩短这个时间

import re
subSeqTotal = len(re.findall('123',pi100k))\

编辑 2:正如 MRAB 指出的那样,最好使用的是pi100k.count('123')

于 2011-06-01T01:40:41.747 回答
0

这些解决方案似乎都不正确。我认为他们没有正确搜索子序列。

我用这个算法在C中递归地解决了它:

/* global cstring for our pi data */
const char *g_numbers = 3.14........[100,000 digits];

/* global to hold our large total : some compilers don't support uint64_t */
uint64_t  g_total = 0;


/* recursively compute the subsequnces of 1-2-3 */
void count_sequences(const char c, unsigned int index)
{
    while (index < 100000){
        switch (g_numbers[index]){
            case '1': if (c == '1') count_sequences('2', index+1); break;
            case '2': if (c == '2') count_sequences('3', index+1); break;
            case '3': 
                      if (c == '3'){
                        g_total++;
                        count_sequences('3', index+1);
                        return;
                      }
            default: break;
        }
        index++;
    }
}

抱歉,我无法分发 Python 解决方案——但我希望这会有所帮助。重新工作应该不会太难。我在 Python 中尝试了给定的答案,但它们似乎没有用。

于 2011-12-28T03:06:57.380 回答