我被要求根据这个系列获得前15个三元组,这个代码应该可以工作。然而,它只产生了一个充满零的表(15*3(,而不是毕达哥拉斯的15个三元组?欢迎任何帮助。
A = zeros(15, 3);
ii = 1;
for c = 5:120
c2=c^2;
for a=1:c-1
a2=a^2;
for b=a:c-1
if c2-(a2+b^2) == 0
A(ii,1) = a;
A(ii,2) = b;
A(ii,3) = c;
ii=ii+1;
if A(15, 1) ~= 0
flag = 1;
break
end
end
end
if flag == 1
break
end
end
if flag == 1
break
end
end
T1 = array2table(A);
disp(T1)
因此,在所有后续尝试失败之前,代码在应用程序重新启动时生成了一个正确的表。而且,现在我注意到,每次重新启动应用程序后,代码仅第一次成功运行。(解决了,谢谢Dan Pollard。(
此外,感兴趣的是知道是否有任何方法不将上限(120(写入代码。
我认为您的if语句永远不会得到满足。例如,对于c=5
,您希望a=3, b=4
是一个三元组。但你只让a
和b
上升到floor(sqrt(c-1))
,也就是2
。
你的意思是让a
和b
上升到floor(sqrt(c2-1))
吗?
编辑因为问题已更改。
当你运行代码时,Matlab会创建你分配的所有变量,并将它们存储在工作空间中。这可能很有用,但在这里它会伤害你,因为你有一个存储为1的变量flag
。这意味着,当代码运行时,它会在第一次运行b
之后检查flag==1
,因此代码结束。通过将clear;
放在脚本的开头来解决此问题。
没有一种实用的方法可以去除c
的上限。Matlab有内置的变量Inf
,但充其量Matlab不会让你在这种情况下使用它。实际上,您可以用一个非常大的数字来替换120
,但随着数字的增大,这将需要更多的时间和内存。不过,计算机有有限的RAM来存储matlab数组,而且有无限多的勾股三元组,所以在没有上限的情况下进行计算在某种程度上会失败。