当给出具有较大值的输入时,不给出输出

Old*_*ack 1 python algorithm python-3.x

我写了一个代码来输出字​​母'a'在列表的给定长度内重复的次数,它与长度小于1000000的输入完美配合,但没有长度大于1000000的输出。我非常感谢您的帮助。

代码:

n = int(input("Length: "))
s = list(input("String: "))
a = s
for i in s:
    if len(a) < n:
        a.append(i)
print(a.count("a"))
print(a)
Run Code Online (Sandbox Code Playgroud)

例如,如果给出如下输入,则不会执行代码

Length: 100000000000000
String: abcasc
Run Code Online (Sandbox Code Playgroud)

我还注意到,当该程序运行时打开/运行另一个应用程序时,我的计算机会死机。

Reb*_*que 5

100,000,000,000,000 是一个大输入...比大多数计算机的可用 RAM 大(大得多)。

在评论中引用@Matthias:

100_000_000_000_000 / (1024 ** 4) 给出了大约 90 的值。即使我们假设一个字符只需要一个字节,仅字符串本身就需要 90TB 的内存。

引用 @itprorh66 评论:

...我想你活不到看到它完成

引用@RaymondHettinger:

一定有更好的方法!

...还有:

您可以通过计算字符串在给定长度内重复的次数乘以其中的次数来解决此问题a,并将a出现在最后剩余长度中的次数相加。

length = 100000000000000
string = 'abcasc'
a_s = sum(1 for c in string if c == 'a') 
repeats = length // len(string)
mod = length % len(string)
res = repeats * a_s + sum(1 for c in string[:mod] if c == 'a')
res
Run Code Online (Sandbox Code Playgroud)

输出:

33333333333334
Run Code Online (Sandbox Code Playgroud)

您也可以将其设为单行,以徒劳地完成练习:

res = sum(1 for c in string if c == 'a') * (length // len(string)) + sum(1 for c in string[:length % len(string)] if c == 'a')
Run Code Online (Sandbox Code Playgroud)