У меня есть задание на zybooks для моего курса программирования на C ++, и всякий раз, когда я запускаю свой код, он выводит все результаты, независимо от того, верный он или неправильный. Мой код:

#include <iostream>
using namespace std;

int main() {
   int x1;
   int y1;
   int ans1; 
   int x2;
   int y2;
   int ans2;
   int x;
   int y;
   
   cin >> x1 >> y1 >> ans1;
   cin >> x2 >> y2 >> ans2;
   
  for (x = -10; x <= 10; x++) {
     for (y = -10; y <= 10; y++) {
        if ((ans1 = (x1 * x) + (y1 * y)) = (ans2 = (x2*x) + (y2*y))) {
           cout << "x = " << x << ", " << "y = " << y << endl;
        }
     }
  }
  
  
   return 0;
}

Инструкции таковы: Многочисленные инженерные и научные приложения требуют поиска решений набора уравнений. Пример: 8x + 7y = 38 и 3x - 5y = -1 имеют решение x = 3, y = 2. Учитывая целые коэффициенты двух линейных уравнений с переменными x и y, используйте грубую силу, чтобы найти целочисленное решение для x и y. в диапазоне от -10 до 10.

Пример: Если ввод:

8 7 38
3 -5 -1

Вывод:

x = 3, y = 2

Используйте этот подход грубой силы:

For every value of x from -10 to 10
   For every value of y from -10 to 10
      Check if the current x and y satisfy both equations. If so, output the solution, and finish

Пример: Если решение не найдено, выведите:

There is no solution

Предположим, что два входных уравнения имеют не более одного решения.

Затем, когда я запускаю программу, мой результат:

x = -10, y = -10
x = -10, y = -9
x = -10, y = -8
...

Вплоть до x = 10 и y = 10

c++
1
Ptoughneigh 14 Окт 2021 в 20:19

2 ответа

Лучший ответ

Здесь я решил это настолько просто, насколько смог, и прокомментировал некоторые логические моменты.

#include <iostream>
using namespace std;

int main() {
   int x1;
   int y1;
   int ans1; 
   int x2;
   int y2;
   int ans2;
   int x;
   int y;
   
    cin >> x1 >> y1 >> ans1;
    cin >> x2 >> y2 >> ans2;
   int flag = 0;
  for (x = -10; x <= 10; x++) {
     for (y = -10; y <= 10; y++) {
        if (ans1 == (x1 * x) + (y1 * y) &&  ans2 == (x2*x) + (y2*y) ) { /*if we got the root of 1st equation then using bitwise and we have to compare that with another equation*/
           cout << "x = " << x << ", " << "y = " << y << endl;
           flag=1; /* If we found the ans then we will raise the flag to 1, So after the end of loop it'll not print the below statement*/
     break;
        }
     }
  }
  if(flag==0){
      cout<<"There is no solution\n";
  }
  
   return 0;
}
0
Dharman 14 Окт 2021 в 17:53

Все знаки = в (ans1 = (x1 * x) + (y1 * y)) = (ans2 = (x2*x) + (y2*y)) являются присвоениями , а не сравнениями.

Clang даже предупреждает вас об этом :

.code.tio.cpp:19:42: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
        if ((ans1 = (x1 * x) + (y1 * y)) = (ans2 = (x2*x) + (y2*y))) {
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
.code.tio.cpp:19:42: note: place parentheses around the assignment to silence this warning
        if ((ans1 = (x1 * x) + (y1 * y)) = (ans2 = (x2*x) + (y2*y))) {
                                         ^
            (                                                      )
.code.tio.cpp:19:42: note: use '==' to turn this assignment into an equality comparison
        if ((ans1 = (x1 * x) + (y1 * y)) = (ans2 = (x2*x) + (y2*y))) {
                                         ^
                                         ==
1 warning generated.

Таким образом, вы должны использовать такие сравнения:

  for (x = -10; x <= 10; x++) {
     for (y = -10; y <= 10; y++) {
        if ((x1 * x + y1 * y == ans1) && (x2*x + y2*y == ans2)) {
           cout << "x = " << x << ", " << "y = " << y << endl;
        }
     }
  }
2
ForceBru 14 Окт 2021 в 17:33