Difference in two for nested loops.(C++)

Difference in two for nested loops.(C++)

本文关键字:C++ loops nested in two for Difference      更新时间:2023-10-16

我试图解决以下问题:

设x,y,z为定义域[-5,5]内的整数。显示满足3*x+y^3-z^2=0的解(x,y,z)的个数。我最初的解决方案是:

int main() {
    int x=-6;
    int y=-6;
    int z=-6;
    int p=0;
    for(int i=-5; i<6; i++)
    {
        x++;
        for (int j=-5; j<6; j++)
        {
            y++;
            for(int k=-5; k<6; k++)
            {
                z++;
                if(3*x +y*y*y -z*z==0)
                    p++;          
            }
        }
    }
    std::cout<< p ;
    return 0;
}

这是正确的解决方案:

 int main() {
        int x=-5;
        int y=-5;
        int z=-5;
        int p=0;
        for( x=-5; x<=5; x++)
           for (y=-5; y<=5; y++)
               for( z=-5; z<=5; z++)
                   if(3*x +y*y*y -z*z==0)
                       p++;
        std::cout<< p;
        return 0;
}

为什么这两个不同,我在第一个中做错了什么?

在"正确"解中,x每增加一个值,y就从-5重新开始。在您的版本中,y从之前的值开始递增,因此第二次迭代覆盖[5,15],第三次覆盖[15,25],以此类推。

奇怪的额外变量j覆盖了每次您希望y覆盖的范围,但y本身没有。

在不正确的代码中,变量y和z在循环开始时没有被重置到其范围的开始位置。

一个更短的正确例子应该是:

int main()
{
    int p = 0;
    for( int x=-5; x<=5; ++x )
       for( int y=-5; y<=5; ++y )
           for( z=-5; z<=5; ++z)
               if( 3*x + y*y*y - z*z == 0 )
                   ++p;
    std::cout << p << std::endl;
    return 0;
}

变量初始化可以直接放入循环中。因为它们是微不足道的变量,所以没有性能损失。