1 2 3 -1 -2 模板题,写个模板留着用,注意负数,要取绝对值 #include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
const int maxn = 105;
int equ, var; // ���equ������������var������������������������������equ, ���������0���equ - 1������������var + 1������������0���var.
int a[maxn][maxn];
int x[maxn]; // ������.
bool free_x[maxn]; // ���������������������������������.
int free_num;
void Debug(void)
{
int i, j;
for (i = 0; i < equ; i++)
{
for (j = 0; j < var + 1; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
//------------------------------------
inline int gcd(int a, int b)
{
int t;
while (b != 0)
{
t = b;
b = a % b;
a = t;
}
return a;
}
inline int lcm(int a, int b)
{
return a * b / gcd(a, b);
}
int abs1(int a)
{
return a>0?a:-a;
}
/
int Gauss(void)
{
int i, j, k;
int max_r; // ���������������������������������.
int col; // ������������������.
int ta, tb;
int LCM;
int temp;
int free_x_num;
int free_index;
// ������������������.
col = 0; // ������������������.
for (k = 0; k < equ && col < var; k++, col++)
{ // 枚举当前处理的行.
max_r = k;
for (i = k + 1; i < equ; i++)
{
if (abs1(a[i][col]) > abs1(a[max_r][col])) max_r = i;
}
if (max_r != k)
{
for (j = k; j < var + 1; j++) swap(a[k][j], a[max_r][j]);
}
if (a[k][col] == 0)
{ // 说明
k--; continue;
}
for (i = k + 1; i < equ; i++)
{ // 枚举要删去的行.
if (a[i][col] != 0)
{
LCM = lcm(abs1(a[i][col]), abs1(a[k][col]));
ta = LCM / abs1(a[i][col]), tb = LCM / abs1(a[k][col]);
if (a[i][col] * a[k][col] < 0) tb = -tb; // 异号的情况是两个数相加.
for (j = col; j < var + 1; j++)
{
a[i][j] = a[i][j] * ta - a[k][j] * tb;
}
}
}
}
for (i = k; i < equ; i++)
{
if (a[i][col] != 0) return -1;
}
if (k < var)
{
for (i = k - 1; i >= 0; i--)
{
free_x_num = 0; //
for (j = 0; j < var; j++)
{
if (a[i][j] != 0 && free_x[j]) free_x_num++, free_index = j;
}
if (free_x_num > 1) continue;
temp = a[i][var];
for (j = 0; j < var; j++)
{
if (a[i][j] != 0 && j != free_index) temp -= a[i][j] * x[j];
}
x[free_index] = temp / a[i][free_index]; // ���������������.
free_x[free_index] = 0; // ���������������������.
}
return var - k; // ���������������var - k���.
}
for (i = var - 1; i >= 0; i--)
{
temp = a[i][var];
for (j = i + 1; j < var; j++)
{
if (a[i][j] != 0) temp -= a[i][j] * x[j];
}
//if (temp % a[i][i] != 0) return -2; // ���������������������������������������.
x[i] = temp / a[i][i];
}
return 0;
}
int main()
{
int i, j,n;
while (scanf("%d", &n) != EOF)
{
equ=var=n;
memset(a, 0, sizeof(a));
memset(x, 0, sizeof(x));
memset(free_x, 1, sizeof(free_x)); // ���������������������������������.
for (i = 0; i < equ; i++)
{
for (j = 0; j < var ; j++)
{
scanf("%d", &a[i][j]);
}
}
for(i=0;i<n;i++)
scanf("%d",&a[i][var]);
// Debug();
free_num = Gauss();
if (free_num == -1) printf("no sovle!\n");
else if (free_num > 0)
{
printf("more sovle!\n");
}
else
{
printf("%d",x[0]);
for (i = 1; i < var; i++)
{
printf(" %d",x[i]);
}
printf("\n");
}
}
return 0;
}
|