ostapdontstop

gauss

Dec 25th, 2018
169
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cmath>
  4. using namespace std;
  5.  
  6. void print (double**a, const int n) {
  7.     for (int i = 0; i < n; ++i) {
  8.         for (int j = 0; j < n+1; ++j) {
  9.             if (j) cout << showpos;
  10.             if (j==n) cout << "= " << noshowpos;
  11.             cout << a[i][j] << ' ';
  12.         }
  13.         cout << endl;
  14.     }
  15. }
  16.  
  17. bool gauss (double**a, const int n);
  18.  
  19. int main(int argc, char const *argv[])
  20. {  
  21.     ifstream fin("input.txt");
  22.     if (!fin) {
  23.         cout << "input.txt is missed!";
  24.         return 0;
  25.     }
  26.    
  27.     int n; fin >> n;
  28.  
  29.     double **a = new double*[n];
  30.     double *b = new double[n*(n+1)];
  31.     for (int i = 0; i < n; ++i)
  32.         a[i] = b + i*(n+1);
  33.  
  34.     for (int i = 0; i < n; ++i)
  35.         for (int j = 0; j < n+1; ++j)
  36.             fin >> a[i][j];
  37.  
  38.     print(a,n);
  39.    
  40.     if (gauss(a,n))
  41.         for (int i = 0; i < n; ++i)
  42.             cout << "\nx" << i+1 << "= " << a[i][n];
  43.  
  44.     else cout << "\nno solutions";
  45.  
  46.     delete[] a;
  47.     delete[] b;
  48.  
  49.     return 0;
  50. }
  51.  
  52. bool gauss (double**a, const int n) {
  53.     double div, swap;
  54.  
  55.     int *ordersort = new int[n*2];
  56.     int *order = ordersort;
  57.     int *sort = ordersort+n;
  58.  
  59.  
  60.     for (int i = 0; i < n; ++i)
  61.         order[i] = sort[i] = i;
  62.  
  63.     for (int j = 0, max_i, max_ip; j < n-1; ++j) {
  64.  
  65.         max_i = order[j];
  66.         for (int i = j+1; i < n; ++i)
  67.             if (fabs(a[max_i][j]) < fabs(a[order[i]][j])) {
  68.                 max_ip = i;
  69.                 max_i = order[i];
  70.             }
  71.  
  72.         if (!a[max_i][j]) return false;
  73.  
  74.         if (max_i != order[j]) {
  75.  
  76.             order[max_ip] = order[j];
  77.             order[j] = max_i;
  78.  
  79.         }
  80.  
  81.         for (int i = j+1; i < n; ++i) {
  82.  
  83.             if (a[order[i]][j]) {
  84.                 div = a[max_i][j]/a[order[i]][j];
  85.                 for (int k = j; k < n+1; ++k)
  86.                     a[order[i]][k]-= a[max_i][k]/div;
  87.             }
  88.         }
  89.  
  90.     }
  91.     if (!a[order[n-1]][n-1]) return false;
  92.  
  93.     for (int j = n-1; j >= 0; --j) {
  94.  
  95.         for (int i = n-1; i > j; i--) {
  96.             a[order[j]][i]*=a[order[i]][n];
  97.             a[order[j]][n]-= a[order[j]][i];
  98.         }
  99.         a[order[j]][n]/= a[order[j]][j];
  100.     }
  101.  
  102.     for (int i = 0; i < n-1; ++i) {
  103.         if (order[i] != sort[i]) {
  104.  
  105.             swap = a[i][n];
  106.             a[i][n] = a[sort[order[i]]][n];
  107.             a[sort[order[i]]][n] = swap;
  108.  
  109.             sort[order[i]] = sort[i];
  110.             sort[i] = order[i];
  111.         }
  112.     }
  113.  
  114.     delete[] ordersort;
  115.  
  116.     return true;
  117. }
RAW Paste Data