zap 29/6

Uživatelský avatar
hippies
Admin(ka) level I
Příspěvky: 990
Registrován: 29. 9. 2004 12:46
Typ studia: Informatika Mgr.
Bydliště: Mladá Boleslav
Kontaktovat uživatele:

zap 29/6

Příspěvek od hippies »

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.

Kód: Vybrat vše

#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");
}
Odpovědět

Zpět na „2005“