#include <stdio.h>
void main ()
{
int a = 0, b = 0, c = 0, n;
int counter = 0;
printf("Please Enter a Positive Integer: \n");
scanf("%d", &n);
for (c = 0; c < n; c++)
{
for (b = 0; b < c; b++)
{
for (a = 0; a < b; a++)
{
if (a * a + b * b == c * c )
{
printf("%d: \t%d %d %d\n", ++counter, a, b, c);
}
}
}
}
}
该程序计算给定整数n中有多少毕达哥拉斯三元组。
这也包括所有一致的三元组。
我想更改程序,使其不包含彼此组合的三元组,我对如何执行此操作感到迷失,任何提示?
例如,当输入整数15
时,将打印的内容如下:
3, 4, 5
6, 8, 10
5, 12, 13
6, 8, 10
是3, 4, 5
的组合,我不希望打印此值。我如何更改程序,以便它不打印另一个毕达哥拉斯三重奏的任何组合?
答案 0 :(得分:6)
虽然你可以只是通过所有三元组而只是保留一个如果它与以前的三元组之一不一致(即如果边长不共享一个共同因素) ,如果你改变程序以便它只找到三个边长不共享一个因子的三元组可能会更容易。这样,会找到类似3, 4, 5
的三元组,但它会完全“跳过”6, 8, 10
。
警告:我建议的是一次相当大的改革。如果你只想要“小”改变,那么这可能不是你想要的。
首先,一点背景知识。毕达哥拉斯三联体的边长是互质的称为原始的毕达哥拉斯三重。欧几里德定理指出,如果m和n是互质整数而m-n是奇数,那么
m 2 - n 2 ,2mn,m 2 + n 2
是原始毕达哥拉斯三重的边长。此外,所有原始的毕达哥拉斯三元组都是这种形式。
因此,你可以做的一件事是重构你的程序,使它循环遍历该范围内的所有可能的m和n,然后进行打印并递增计数器。像这样:
for all m within range
for all n greater than m (but still within range)
if gcd(m,n) = 1
print out m*m - n*n, 2*m*n, and m*m + n*n
increment the counter
其中在范围内表示m*m + n*n
仍然小于您在输入中读取的任何限制。 for循环也必须结构化,以便“m-n odd”始终为真,但这并不需要太多。
答案 1 :(得分:0)
以下修改代码应该修复它:
#include <stdio.h>
void main ()
{
int a = 0, b = 0, c = 0, n,i,flag;
int counter = 0;
printf("Please Enter a Positive Integer: \n");
scanf("%d", &n);
for (c = 0; c < n; c++)
{
for (b = 0; b < c; b++)
{
for (a = 0; a < b; a++)
{
if (a * a + b * b == c * c )
{
flag=0;
for(i=2; i < c ; i++)
{
if(a%i==0 && b%i==0 && c%i==0)
{
flag = 1;
break;
}
}
if(flag)
continue;
printf("%d: \t%d %d %d\n", ++counter, a, b, c);
}
}
}
}
}