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");
}