Не могу сделать вложенную петлю - PullRequest
0 голосов
/ 10 марта 2012

Этот цикл работает до тех пор, пока l равно 1, а h может быть любым числом.Но мне нужно, чтобы он работал в разных диапазонах, таких как l = 20 ч = 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 ]

3 голосов
/ 10 марта 2012

Если я вас правильно понимаю, вы пытаетесь подстроить систему Диофанта

  • a ^ 2 + b ^ 2 = c ^ 2
  • a + b + c

это решение

#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
2 голосов
/ 10 марта 2012

В этой строке есть что-то смешное, я не могу сказать, что вы пытаетесь сделать ...

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

Итак, в первом раунде a=l, a++ и условие проверяется l<=a. a будет 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;
                }
            }
        }
    }
}
1 голос
/ 10 марта 2012

Я думаю, что одна проблема в вашем третьем цикле, которая немного отличается от двух других:

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

На первом проходе a == 1 и b == 1 и l == 1, поэтому c установлено в 1, а l < c оценивается как ложное, поэтому внутренний цикл не выполняется.

Вам действительно не нужно проверять нижние границы (l < c, или l <= b и т. д.).в более ранних циклах), потому что вы знаете из способа их установки, что условие должно быть истинным, за исключением случаев, когда вы делаете опечатку в условии.

Каноническая форма для цикла for в C ++:

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

для подходящего типа (int здесь), индексная переменная (i) идет от нижней границы lo до верхней границы hi, но не включает ее.Это работает и в C99, но не в C89.Если вам нужно значение индекса цикла после его завершения, вы можете объявить переменную в большем объеме, чем просто цикл, как показано, но вы обычно избегаете этого.(Я использовал i++ в комментарии, потому что я нереформированный программист C, но предварительное увеличение лучше в C ++ в целом.)

0 голосов
/ 10 марта 2012

в первом цикле условие будет ложным с первого раза, потому что l> a

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...