【问题标题】:Write GCD's to file将 GCD 写入文件
【发布时间】:2015-10-30 14:07:42
【问题描述】:

我需要创建一个程序来计算五对数字的 GCD 并将它们打印到一个文本文件 (OUT1.txt)。每个输入对存储在文本文件 (DATA1.txt) 的单独行中,如下所示:

18 24
112 1
43243 333343
20492 87091
3293 979

我目前的代码没有输出任何东西,尽管数学运算是正确的。到目前为止我的代码如下:

outputFile = open('OUT1.txt', 'w+')

n1 = 0
n2 = 0

with open('DATA1.txt', 'w+') as data:
    for line in data:
        twoNums = line.split()
        n1 += int(twoNums[0])
        n2 += int(twoNums[1])
data.close()


def gcd(n1, n2):
    n = min(n1, n2)
    cds = []
    for i in range(1, n+1):
        while i > 1:
            remainder1 = n1 % i
            remainder2 = n2 % i
            if remainder1 == 0 and remainder2 == 0:
                cds.append(i)
            break
    if not cds:
        outputFile.write('1')
    else:
        outputFile.write(str(max(cds)))


def egcd(n1, n2):
    while n2 != 0:
        (n1, n2) = (n2, n1 % n2)
    outputFile.write(str(n1))
    outputFile.close()

gcd(n1, n2)
egcd(n1, n2)

我不确定这有什么问题;任何帮助将不胜感激。

【问题讨论】:

  • 这是一种非常脆弱的文件处理方式——如果在gcd 之前调用egcd 会怎样?您应该分离计算并将其结果写入文件到单独的函数中,并适当地传递参数/返回值。
  • 您应该在打开输入文件的同时打开输出文件。然后您可能会像现在一样或多或少地阅读每一行,然后分配(而不是递增)n1n2,然后调用 gcd(n1, n2) 并将结果打印到输出文件。 egcd() 函数应该去; gcd() 函数应该只做数字工作(不打印)。
  • 我认为你的问题是你用'w+'打开了DATA1.txt——我很确定应该只是'r',因为你从来没有写过它.此外,data.close() 完全没有意义。 with 块在文件末尾自动关闭文件。此外,您在一个范围内打开 outputFile 却在另一个范围内关闭它真的很奇怪......但这可能不会导致任何问题。

标签: python io greatest-common-divisor


【解决方案1】:

这是否完成了您想做的事情?它读取每行有一对数字的文件,并将它们的 GCD 写入另一个文件。

import math


def main():
    with open('DATA1.txt', 'r') as read, open('OUT1.txt', 'w') as write:
        for line in read:
            print(math.gcd(*map(int, line.split())), file=write)

if __name__ == '__main__':
    main()

创建一个名为OUT1.txt 的文件,其内容如下:

6
1
1
5123
89

【讨论】:

    【解决方案2】:

    读取和写入文件的位置应该在同一范围内(程序的主要部分,并且 gcd() 和 egcd() 不应访问文件。让它们返回值。

    所以你会看到:

    gcd1 = gcd(n1, n2)
    

    gcd2 - egcd(n1,n2)
    

    然后将这些值写入您的文件。

    其中一个问题是 egcd() 关闭了输出文件,这意味着您无法再次对其进行写入。

    另一个问题是您只调用 gcd() 和 egcd() 一次。这些调用应该在您的 with open() 块内的 for 循环内,以便为文件中的每一行重复调用它们。

    【讨论】:

      猜你喜欢
      • 2016-01-16
      • 2016-04-13
      • 2011-01-28
      • 2018-07-22
      • 2015-01-19
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      相关资源
      最近更新 更多