Advertisement
Tooster

gauss

Oct 11th, 2015
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. // https://themis.lo14.wroc.pl/2ITN2015/GAUSS1
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. vector < vector <long double> >T;
  7. vector <long double> x;
  8. int n;
  9.  
  10. void readMatrix() {
  11.     long double a;
  12.     scanf("%d ", &n);
  13.     T.resize(0);
  14.     x.resize(0);
  15.     T.resize(n);
  16.     x.resize(n);
  17.     for (int i = 0; i < n; i++) {
  18.         for (int j = 0; j <= n; j++) {
  19.             scanf("%Lf", &a);
  20.             T[i].push_back(a);
  21.         }
  22.     }
  23. }
  24.  
  25. //void printMatrix(int a) {
  26. //  printf("#=== %d\n", a);
  27. //  for (int i = 0; i < n; i++) {
  28. //      for (int j = 0; j <= n; j++) {
  29. //          printf("%lf ", T[i][j]);
  30. //      }
  31. //      printf("\n");
  32. //  }
  33. //  printf("\n");
  34. //}
  35.  
  36. void printRoots() {
  37.     x[n - 1] = T[n - 1][n] / T[n - 1][n - 1]; //dodaje Xn
  38.     for (int i = n - 2; i >= 0; i--) {
  39.         long double r = T[i][n] * (-1); //to co po znaku równości
  40.         for (int j = n - 1; j > i; j--)
  41.             r += T[i][j] * x[j];
  42.         x[i] = r / T[i][i];
  43.         x[i] *= -1;
  44.     }
  45.     for (int i = 0; i < n; i++) {
  46.         printf("%.6Lf ", x[i]);
  47.     }
  48.     printf("\n");
  49. }
  50.  
  51. bool thxrafzadbg(int k) {
  52.     for (int s = k + 1; s < n; s++) {
  53.         if (abs(T[k][k]) < abs(T[s][k]))
  54.             swap(T[s], T[k]);
  55.     }
  56.     //printMatrix(k);
  57.     if (abs(T[k][k]) <= 0.000001) return 0;
  58.     return 1;
  59. }
  60.  
  61. void f() {
  62.     readMatrix();
  63.     for (int k = 0; k < n; k++) { // main loop
  64.                                   ///printMatrix();
  65.  
  66.         if (!thxrafzadbg(k)) {
  67.             printf("ZA TRUDNE\n");
  68.             return;
  69.         }
  70.         for (int i = k + 1; i < n; i++) {
  71.             long double multiplier = T[i][k] / T[k][k];
  72.             for (int j = k; j <= n; j++) {
  73.                 T[i][j] -= T[k][j] * multiplier;
  74.             }
  75.         }
  76.     }
  77.     printRoots();
  78. }
  79.  
  80. int main() {
  81.     int testy;
  82.     scanf("%d", &testy);
  83.     while (testy--) f();
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement