这是我第一篇关于堆栈溢出的帖子,我想要一些帮助,我正在尝试为我的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;
}
}
}
}
现在,它陷入无限循环。
答案 0 :(得分:1)
使用 i 枚举 i , j 和 k 的所有不同组合, j < / 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 < / em> = 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
}