# 6

<{ForumPost(poster="hippies", timestamp=2006-06-29 12:55:27)}>
Tak dneska bylo za ukol spocitat determinant matice nxn, zadane v souboru nejprv n a pak n^2 cisel po radcich, oddeleno bilymi znaky ci podle vlastni konvence zarovnano,...  
  
Bednarek navrhl tri postupy:  
    1. pres permutace z definice  
    2. rozvoj podle radku/sloupce  
    3. gaussovka a soucin diagonaly  
  
trojka ma slozitost n^3 zbytek n! ale to mu bylo jedno  
bylo to v celych cislech a dalo se predpokladat, ze se to vejde  
  
Moje trochu prasacke reseni (napsane za 15min+5min ladeni, takze podle toho vypada) prikladam.  

    #include <stdio.h>
    #include <stdlib.h>
    
    
    int **alokuj(int n){
      int i;
      int **p;
      p=(int**)malloc(sizeof(int*)*n);
      for(i=0;i<n;++i){
        p[i]=(int*)malloc(sizeof(int)*n);
      }
      return p;
    };
    
    void tisk(int n, int **matice){
      int i,j;
      for(i=0;i<n;++i){
        for(j=0;j<n;++j){
          printf("%d\t",matice[j][i]);
        }
        printf("
    ");
      }
      printf("---------
    ");
    }
    
    int pocitej(int n, int**matice){
      int i, x, y, ii, soucet;
      int**m2;
    
      if (n==1){
        return matice[0][0];
      };
    
      m2=alokuj(n-1);
      soucet=0;
    
      for (i=0;i<n;++i){
        for(x=1;x<n;++x){
          for(y=0, ii=0; y<i; ++y, ++ii){
            m2[x-1][ii]=matice[x][y];
          }
          for(y=i+1; y<n; ++y, ++ii){
            m2[x-1][ii]=matice[x][y];
          }
        }
        //tisk(n-1,m2);
        if(i%2==0){
          soucet+=matice[i][0]*pocitej(n-1,m2);
        }else{
          soucet-=matice[i][0]*pocitej(n-1,m2);
        }
        //printf("
    ----d=%d
    
    ",soucet);
      }
      return soucet;
    }
    
    int main(int argc, char** argv){
      int i,j, n;
      int **matice;
      FILE* f;
    
      if (argc!=2){
        return 1; //chyba
      };
    
      //----------------- načti vstup --------------------
      f=fopen(argv[1], "r");
      fscanf(f, "%d", &n);
    
      matice=alokuj(n);
    
      for(i=0;i<n;++i){
        for(j=0;j<n;++j){
          fscanf(f,"%d",matice[i]+j);
        }
      }
    
      fclose(f);
    
      //--------------------- výpočet -------------------------------
      tisk(n,matice);
      printf("det = %d
    -------------------
    ", pocitej(n,matice));
      system("Pause");
    }
    


<{/ForumPost}>

