Определитель матрицы
Из-за деления на нуль программа выдает -nan в случае, если первый элемент матрицы нулевой. Как можно было бы исправить эту ошибку ?
#include <stdio.h>
int main () {
int n, i, j, k;
scanf("%d", &n);
double a[n][n], t, det;
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
scanf("%lf", &a[i][j]);
}
}
for(k = 0; k < n; k++) {
for(i = k+1; i < n; i++) {
t = a[i][k] / a[k][k];
a[i][k] = 0;
for(j = k+1; j < n; j++) {
a[i][j] = a[i][j] - t * a[k][j];
}
}
}
det = 1.0;
for(k = 0; k < n; k++) {
det = det * a[k][k];
}
printf ("det: %lf\n", det);
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Примерно так:
double GaussDet(double**m, int n)
{
double det = 1;
for(int i = 0; i < n; ++i)
{
double mx = fabs(m[i][i]);
int idx = i;
for(int j = i+1; j < n; ++j)
if (mx < fabs(m[i][j])) mx = fabs(m[i][idx = j]);
if (idx != i)
{
for(int j = i; j < n; ++j)
{
double t = m[j][i];
m[j][i] = m[j][idx];
m[j][idx] = t;
}
det = -det;
}
for(int k = i+1; k < n; ++k)
{
double t = m[k][i]/m[i][i];
for(int j = i; j < n; ++j)
m[k][j] -= m[i][j]*t;
}
}
for(int i = 0; i < n; ++i) det *= m[i][i];
return det;
}
Полный пример - https://ideone.com/zSD3Y2