Advertisement
Solingen

z2.3.cpp

Dec 21st, 2024
18
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.41 KB | None | 0 0
  1. #include <iostream>
  2. #include "string.h"  // ваша библиотека
  3. #include "array.h"   // ваша библиотека
  4. using namespace std;
  5.  
  6. int mod5(int x)
  7. {
  8.     return (x % 5 + 5) % 5;
  9. }
  10. int inv5(int x)
  11. {
  12.     x = mod5(x);
  13.     for(int i = 1; i < 5; i++)
  14.         if ((x * i) % 5 == 1) return i;
  15.     return -1;
  16. }
  17.  
  18. bool isSquareMod5(int x)
  19. {
  20.     x = mod5(x);
  21.     for (int r = 0; r < 5; r++)
  22.         if (mod5(r*r) == x) return true;
  23.     return false;
  24. }
  25. int sqrtMod5(int x)
  26. {
  27.     x = mod5(x);
  28.     for (int r = 0; r < 5; r++)
  29.         if (mod5(r*r) == x) return r;
  30.     return -1;
  31. }
  32.  
  33. // Функция факторизации
  34. String factorQuadratic(int a, int b, int c)
  35. {
  36.     // Соберём результат в String
  37.     String msg;
  38.  
  39.     // Нормализуем
  40.     a = mod5(a);
  41.     b = mod5(b);
  42.     c = mod5(c);
  43.  
  44.     // Проверяем a=0
  45.     if (a == 0)
  46.     {
  47.         if (b == 0)
  48.         {
  49.             if (c == 0)
  50.                 msg = "Любой x (тождество 0=0)";
  51.             else        
  52.                 msg = "Нет решений (противоречие)";
  53.             return msg;
  54.         }
  55.         // Иначе линейно
  56.         int ib = inv5(b);
  57.         if (ib == -1)
  58.         {
  59.             msg = "Нет решения: b=0 по модулю 5";
  60.             return msg;
  61.         }
  62.         int root = mod5(-c * ib);
  63.         msg = "Линейный случай, x=";
  64.         // Конкатенация:
  65.         msg = msg + to_string(root).c_str();
  66.         return msg;
  67.     }
  68.  
  69.     // Квадратный случай
  70.     int D = mod5(b*b - 4*a*c);
  71.     if (!isSquareMod5(D))
  72.     {
  73.         msg = "Неприводим над F5";
  74.         return msg;
  75.     }
  76.  
  77.     int sd = sqrtMod5(D);
  78.     int i2a = inv5(mod5(2*a));
  79.     if (i2a == -1)
  80.     {
  81.         msg = "Нет обратного к 2a!";
  82.         return msg;
  83.     }
  84.  
  85.     int r1 = mod5(mod5(-b + sd) * i2a);
  86.     int r2 = mod5(mod5(-b - sd) * i2a);
  87.    
  88.     // Формируем строку
  89.     if (r1 == r2)
  90.     {
  91.         msg = "(x - ";
  92.         msg = msg + to_string(r1).c_str();
  93.         msg = msg + ")^2";
  94.     }
  95.     else
  96.     {
  97.         msg = "(x - ";
  98.         msg = msg + to_string(r1).c_str();
  99.         msg = msg + ")(x - ";
  100.         msg = msg + to_string(r2).c_str();
  101.         msg = msg + ")";
  102.     }
  103.     return msg;
  104. }
  105.  
  106. int main()
  107. {
  108.     // Допустим, хотим разложить несколько многочленов сразу
  109.     // Сохраним их коэффициенты в Array<int>
  110.     Array<int> polys;
  111.     // Вводим количество
  112.     int n;
  113.     cout << "Сколько многочленов? ";
  114.     cin >> n;
  115.  
  116.     // Каждые 3 числа (a,b,c) - один многочлен
  117.     for (int i = 0; i < n; i++)
  118.     {
  119.         cout << "Введите a,b,c для многочлена #" << i << ": ";
  120.         int a, b, c;
  121.         cin >> a >> b >> c;
  122.         polys.append(a);
  123.         polys.append(b);
  124.         polys.append(c);
  125.     }
  126.  
  127.     // Теперь обрабатываем
  128.     for (int i = 0; i < n; i++)
  129.     {
  130.         int a = polys[i*3 + 0];
  131.         int b = polys[i*3 + 1];
  132.         int c = polys[i*3 + 2];
  133.         String result = factorQuadratic(a, b, c);
  134.  
  135.         cout << "Многочлен " << i << ": ";
  136.         cout << a << "x^2 + " << b << "x + " << c << " => " << result << endl;
  137.     }
  138.  
  139.     return 0;
  140. }
  141.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement