这是我关于堆栈溢出的第一篇文章,我想要一些帮助我正在尝试为我的 c++ 类编写算法并且不太熟悉英语数学术语,我发现很难在网上搜索这样的东西。我需要计算 3 个平方数之和的所有不同可能组合,例如 <= 比一个设定数
`x^2+y^2+z^2 <= n^2`
例如
如果n=1,那么可能的组合是
(x=0 y=0 z=1), (x=0 y=1 z=0), (x=1 y=0 z=0)
如果n=2那么可能的组合就是前面的所有加
(x=0 y=1 z=1) (x=1 y=1 z=0) (x=1 y=0 z=1) (x=2 y=0 z=0) (x=0 y=2 z=0) (x=0 y=0 z=2)
我确实必须对 n=100 做同样的事情,发现很难制作 3 个循环来产生这个序列并覆盖每个组合,以及计数器来计算它们并将它们打印在屏幕上。
我的代码是这样的:
int i,j,k,pl=0;
for (i=0; i<=100; i++) // last digit
{
if (i==k)
k=k-1;
if (i*i+j*j+k*k<=100*100)
{
pl++;
cout<<k<<" "<<j<<" "<<i;
}
for(j=0; j<=i; j++) //second digit
{
if (j==i)
i=i-1;
if (i*i+j*j+k*k<=100*100)
{
pl++;
cout<<k<<" "<<j<<" "<<i;
}
for(k=0; k<=j; k++) //first digit
{
if (k==j)
j=j-1;
if (i*i+j*j+k*k<=100*100)
{
pl++;
cout<<k<<" "<<j<<" "<<i;
}
}
}
}
目前,它陷入了无限循环。
最佳答案
用i、j<枚举i、j和k的所有不同组合/em>,k 介于 0 和 100 之间:
for (i = 0; i <= 100; ++i)
for (j = i; j <= 100; ++j)
for (k = j; k <= 100; ++k)
{
// Do something with i, j, and k
}
注意:这给出了所有不同的组合。例如,在它枚举了组合 i = 0, j = 1, k = 2 之后它不会产生 i = 2, j = 0, k = 1 因为 0 1 2 和 2 0 1 不是不同的组合。
如果你想要所有组合,而不消除重复,那么三个普通循环显然就足够了:
for (i = 0; i <= 100; ++i)
for (j = 0; j <= 100; ++j)
for (k = 0; k <= 100; ++k)
{
// Do something with i, j, and k
}
关于c++ - 计算 3 个数的平方和的组合的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41755966/