Untitled
unknown
c_cpp
2 years ago
2.5 kB
2
Indexable
#include <algorithm> #include <cmath> #include <iostream> #include <set> #include <vector> using namespace std; // struct qui represente les solutions trouvées struct sol { int a, b, c, d; bool operator<(const sol& other) const { if (a != other.a) return a < other.a; if (b != other.b) return b < other.b; if (c != other.c) return c < other.c; return d < other.d; } }; int main() { // lecture des données int A, B; cin >> A >> B; // vecteur des solutions vector<sol> solutions; // vérifier toutes les combinaisons de a et b telles que 1 <= a <= A et 1 <= b <= B for (int a = 1; a <= A; a++) { for (int b = a; b <= B; b++) { // si a et b sont impairs, prochaine itération if (a % 2 != 0 && b % 2 != 0) continue; // les carrés et a et b int a2 = a * a; int b2 = b * b; int p = 2; while ((p*p) < (a2 + b2)) { if ((a2+b2)%p == 0) { int p2 = p * p; // p carré int c = (a2 + b2 - p2) / (2 * p); // calcul de c int d = (a2 + b2 + p2) / (2 * p); // calcul de d // trier les 3 valeurs afin d'avoir a <= b <= c vector<int> abc; abc.push_back(a); abc.push_back(b); abc.push_back(c); sort(abc.begin(), abc.end()); // sauvegarder la solution struct sol s; s.a = abc[0]; s.b = abc[1]; s.c = abc[2]; s.d = d; if (s.a <= s.b && s.b <= s.c && s.c <= s.d && ((s.a*s.a)+(s.b*s.b)+(s.c*s.c)==(s.d*s.d))) solutions.push_back(s); } p++; } } } // simplification sort(solutions.begin(), solutions.end(), [](sol a, sol b){return a.a < b.a;}); // set afin d'avoir des solutions uniques set<sol> solutionsUniques; for (auto& el : solutions) { solutionsUniques.insert(el); } // afficher les solutions for (auto el : solutionsUniques) { if (el.a > 0 && el.a <= A && el.b > 0 && el.b <= B) cout << el.a << " " << el.b << " " << el.c << " " << el.d << endl; } return 0; }
Editor is loading...