计算3个数平方和的组合算法

时间:2017-01-20 04:10:04

标签: c++ algorithm

这是我第一篇关于堆栈溢出的帖子,我想要一些帮助,我正在尝试为我的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;
            }
        }
    }
}

现在,它陷入无限循环。

1 个答案:

答案 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
  }