不能做一个嵌套循环

时间:2012-03-10 03:55:04

标签: c++ for-loop

只要l为1且h可以是任何数字,此循环就起作用。但我需要它从不同的范围工作,如l = 20 h = 40?谁能告诉我怎么做?我将不胜感激。

#include <iostream>
#include <vector>
#include <list>
#include <math.h>
#include <algorithm>


using namespace std;

int main(void)
{
    int a, b, c, i = 0;
    unsigned long l = 1; 
    unsigned long h = 25;
    int array[3];

    for ( a = l; l <= a && a <= h; ++a )
        for ( b = a; l <= b && b <= h; ++b )
            for ( c = b; l < c && c <= h; ++c )
                if ( a * a + b * b == c * c )
                {
                    array[0] = a;
                    array[1] = b;
                    array[2] = c;

                    if (array[0]+array[1]+array[2] <= h)
                        cout << array[0] << " " << array[1] << " " << array[2] <<endl;
                    else
                        break;
                }
    return 0;
}

4 个答案:

答案 0 :(得分:3)

如果我理解你的话,那你就是在试图强迫Diophant的系统

  • a ^ 2 + b ^ 2 = c ^ 2
  • a + b + c&lt; ħ

这是解决方案

#include <iostream>

using namespace std;

int main() {
    const int l = 1;
    const int h = 25;
    for ( int a = l; a <= h; ++a )
        for ( int b = l; b <= h; ++b )
            for ( int c = l; c <= h; ++c )
                if ((a * a + b * b == c * c ) &&
                    (a + b + c  <= h)) 
                        cout << a << " " << b << " " << c <<endl;

    return 0;
}

输出是:

3 4 5
4 3 5
6 8 10
8 6 10

如果你不需要区分a和b,第二个循环可能是

for ( int b = a; b <= h; ++b )

所以你会得到这个:

3 4 5
6 8 10

答案 1 :(得分:2)

这条线路有一些有趣的东西,我不知道你要做什么......

for ( a = l; l <= a && a <= h; ++a )

因此,在第一轮a=la++,并检查条件l<=aa将为l+1,这意味着l<=l+1,因此您将在第一次之后退出循环。我怀疑这不是你想要的行为,但我真的不知道你想做什么。我可以推测你想要这样的东西:

for ( a = 0; l <= a && a <= h; ++a )

编辑:从您的评论中,我可以看到您正在尝试做什么,这应该会更好。基本上,您不需要具有较低值的条件,它是您的问题的根源。此外,我不明白为什么你懒得把值放到一个数组中,每次都写出来,所以我把它删除了。

for ( a = l; a <= h; ++a ) {
    for ( b = a;  b <= h; ++b ) {
        for ( c = b; c <= h; ++c ) {
            if ( a * a + b * b == c * c ) {
                if (a+b+c <= h) {
                    cout << a << " " << b << " " << c <<endl;
                }
                else {
                    break;
                }
            }
        }
    }
}

答案 2 :(得分:1)

我认为一个问题出现在你的第三个循环中,这与其他两个循环略有不同:

for ( c = b; l < c && c <= h; ++c ) {

在第一次传递时,a == 1b == 1以及l == 1因此c设置为1,而l < c的计算结果为false,因此内循环不执行。

你真的不需要测试你的下界(早期循环中的l < cl <= b等),因为你从你设置的方式知道条件应该是真的,除非你在这种情况下打错了。

C ++中for循环的规范形式是:

 for (int i = lo; i < hi; ++i)

对于合适的类型(此处为int),索引变量(i)从下限lo开始,但不包括上限hi。这也适用于C99,但不适用于C89。如果在循环完成后需要循环索引的值,那么可能在更大的范围内声明变量,而不仅仅是如图所示的循环,但是你通常会避免这样做。 (我在注释中使用了i++,因为我是一个未经过改编的C程序员,但一般来说,在C ++中预增量更好。)

答案 3 :(得分:0)

在第一次循环时,条件将从第一次开始为假,因为l> a