Python-关于gcd的数组

Python-array about gcd

Q 我尝试了很多方法,但没有用。请告诉我一个方法。

我最后一次尝试的代码;

n = int(sys.argv[1])

x = stdarray.create2D(n,n,0)


for i in range(n):
    for j in range(n):
        if i > j:
            while j != 0:
                z = i % j
                i = j
                j = z
        elif j > i:
            while i != 0:
                z = j % i
                j = i
                i = z
        if i == 1 or j == 1:
            stdio.write("* ")
        else:
            stdio.write(" ")
    stdio.writeln()

并且我从我的代码中解释了一些细节,我使用的库与平常不同。 stdio.writeln 就像打印一样。你应该认为它是打印...

和stdarray.create bla bla 是一个数组。 第一个 n 代表:行 第二个 n 代表:列 如您所见,它将是方阵。 (因为他们俩都是"n")

我的代码输出是;如果我在 argv 中输入 5。它将是 5x5 矩阵。输出是;

0 1 2 3 4 
1 1 1 3 4
2 1 1 3 4
3 1 1 3 4
4 1 1 3 4

但这是错误的。例如此输出中的 a2 = 3 。 但这是错误的。肯定是; 1. 3 和 2 的 gcd 应该是 1. 而不是 3.

我尝试了很多方法。但我没有解决这个问题。


对于 Primusa, 你的代码是正确的,但在我的大学里,我们还没有看到功能。 su 我不能使用函数。

所以这是你的正确代码,

for i in range(n):
    for j in range(n):
        GCD = gcd(i, j)
        if GCD == 1:
            stdio.write("* ")
        else:
            stdio.write(" ")
    stdio.writeln()

并且我试图在没有功能的情况下更改该代码。但不起作用。 我的代码,

for x in range(n):
    for y in range(n):
        while y != 0:
            temp = y
            y = x % y
            x = temp
        GCD = x
        if GCD == 1:
            stdio.write("* ")
        else:
            stdio.write(" ")
    stdio.writeln()

你的输出, Your code 我的输出, my code 但我的代码是错误的。我的代码的输出如何与您的一样?

通常我的欧几里德的方法是正确的。但是当我使用该代码进行嵌套时,它将不起作用。

您最大的问题似乎是您的 gcd 实现。 在 python 中获取 gcd 的一种简单方法是直接导入它:

from fractions import gcd

如果想自己实现,可以用Euclid的方法:

def gcd(a, b):
    while b:
        a, b = b, a%b
    return a

将其置于您的代码上下文中:

n = int(sys.argv[1])

for row in range(n):
    for col in range(n):
        GCD = gcd(row, col)
        if GCD == 1:
            stdio.write("* ")
        else:
            stdio.write(" ")
stdio.writeln()

如果你想在没有任何函数的情况下进行,请记住使用单独的变量,因为函数可能会无意中修改那些值:

for x in range(n):
    for y in range(n):
        a = y
        b = x
        while b:
            a, b = b,a%b
        GCD = a
        if GCD == 1:
            stdio.write("* ")
        else:
            stdio.write("  ") #note outputs weren't lining up so I added an extra whitespace
    stdio.writeln()