3

我在项目 euler 尝试了第10题 并通过了,但我决定,如果我将所有低于 200 万的素数写入一个文本(.txt)文件会怎样,所以我继续对解决问题的主要功能进行了一些小调整因此,不只是将它添加到变量(tot)中,我将生成器生成的素数写入文本文件,它起初工作但忘记在每个素数后添加空格,所以输出有点乱码

357111317192329313741434753

所以我修改了我txt.write(str(next_prime))txt.write(str(next_prime) + ' ')

稍作修改后,输出完全是乱码

″‵‷ㄱㄠ″㜱ㄠ‹㌲㈠‹ㄳ㌠‷ㄴ㐠″</p>

这是我完整的函数代码:

def solve_number_10():
    total = 2
    txt = open("output.txt","w")
    for next_prime in get_primes(3):
        if next_prime < 2000000:
            txt.write(str(next_prime) + ' ')
            #total += next_prime
        else:
            print "Data written to txt file"
            #print total
            txt.close()
            return

为什么会发生这种情况,我怎样才能使输出像

3 5 7 11 13 17 19
4

2 回答 2

11

这是 Microsoft 记事本程序中的错误,而不是您的代码中的错误。

>>> a = '‵‷ㄱㄠ″㜱ㄠ‹㌲㈠‹ㄳ㌠‷ㄴ㐠'
>>> a.decode('UTF-8').encode('UTF-16LE')
'5 7 11 13 17 19 23 29 31 37 41 4'

哦,嘿,看,它们是质数(我假设 4 只是截断的 43)。

您可以通过以下方式解决记事本中的错误

  1. 使用没有错误的其他文件查看器。

  2. 一次,将 ZWNBSP 写入文件的开头,以 UTF-8 编码:

    txt.write(u'\uFEFF'.encode('UTF-8'))
    

    这被错误地称为 BOM。它将是 UTF-16 中的 BOM,但 UTF-8 在技术上不应该具有 BOM。大多数程序会忽略它,而在其他程序中它是无害的。

于 2013-06-27T15:54:33.500 回答
1

尝试这个:

txt.write('%i ' % next_prime)

看起来str()正在将您的号码转换为以某种编码匹配的字符,而不是其字符串表示形式。

于 2013-06-27T15:50:58.163 回答