Найти ошибку в коде программы
Добрый день Программа должна высчитывать определитель квадратной матрицы, размер которой вводится с клавиатуры, но при n > 2 программа высчитывает ее неправильно. К примеру, для матрицы:
41 67 34
0 69 24
78 58 62
Определитель должен равняться 60762, но программа выводит 79212.
Код программы:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
printf("Vvedite razmer n kvadratnoi matrici: ");
scanf("%d", &n);
int i = 0, j = 0, k = 0;
int a[n][n], d = 1, r = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
a[i][j] = rand() % 100;
printf("%d ", a[i][j]);
}
printf("\n");
}
if (n == 1)
{
d = a[0][0];
printf("Opredelitel matrici raven - %d", d);
return 0;
}
if (n == 2)
{
d = a[0][0] * a[1][1] - (a[1][0] * a[0][1]);
printf("Opredelitel matrici raven - %d", d);
return 0;
}
if (n > 2)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (j > i)
{
r = a[j][i] / a[i][i];
for (k = 0; k < n; k++) a[j][k] -= r * a[i][k];
}
}
}
}
for(i = 0; i < n; i++) d *= a[i][i];
printf("Opredelitel matrici raven - %d", d);
return 0;
}
Помогите, пожалуйста, найти ошибку.
Ответы (2 шт):
Лучше как d так и r сделать вещественными числами, а не целыми. Т.к. при делении целых чисел отбрасывается дробная часть.
Так же можно вместо проверки if (j > i) написать вот так:
double r = 0;
double d = 1;
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++) {
r = a[j][i] / a[i][i];
for (int k = 0; k < n; k++)
a[j][k] -= r * a[i][k];
}
Чтобы всё заработало нужно сделать вещественными d, r, a и поправить операторы печати. Вы делите целые числа, при делении остатки отбрасываются, что приводит к неправильным результатам:
// int a[n][n], d = 1, r = 0;
double a[n][n], d = 1, r = 0;
Я ещё рекомендую убрать специальную обработку для n = 1, n = 2. Она лишняя, затрудняет отладку общего случая.
Общие слова: метод Гаусса для целочисленных матриц не подходит, нужны дроби, знаменатели которых будут быстро расти и вызывать переполнение. Если матрицы не большие, то определитель считается разложением по строке.