题目描述
附带定位接口
样例
//1
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
double a[N][N+1];
const double eps = 1e-8;
int n;
void print_a()
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n+1; j++)
printf("%.2lf ", a[i][j]);
cout << endl;
}
cout << endl;
}
int main()
{
int flag = 1; //表示默认有唯一解
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n+1; j++)
cin >> a[i][j];
int i1 = 1;
for(int j = 1; j <= n; j++) //计算第几个未知数。
{
int t = i1; //找首列绝对值最大的行,担心误判0。
for(int i = i1; i <= n; i++)
if(abs(a[i][j]) > abs(a[t][j])) t = i;
//printf("a[%d][%d]: %.2lf\n", t, j, a[t][j]);
if(abs(a[t][j]) > eps)
{
for(int k = n+1; k >= j; k--)
{
//printf("a[%d][%d] /= t(%.2lf)\n", i, k, t);
a[t][k] /= a[t][j];
swap(a[t][k], a[i1][k]);
}
}
else continue;
//print_a();
for(int i = i1 + 1; i <= n; i++) //用当前行将这列下面所有的元素消成0
if(abs(a[i][j]) > eps)
for(int k = n+1; k >= j; k--)
a[i][k] -= a[i][j] * a[i1][k];
//print_a();
i1++;
}
//printf("i1[%d]\n", i1);
if(i1 - 1 < n)
{
for(int i = n; i >= i1; i--)
if(abs(a[i][n]) < eps)
{
if(abs(a[i][n+1]) > eps)
{
flag = 3; //表示方程无解
break;
}
else flag = 2; //表示方程有无数解
}
}
//printf("flag(%d)\n", flag);
if(flag == 1)
{
for(int j = n; j >= 2; j--)
{
for(int i = j - 1; i >= 1; i--)
{
double t = a[i][j] / a[j][j];
for(int k = j; k <= n+1; k++)
a[i][k] -= t * a[j][k];
}
}
for(int j = 1; j <= n; j++)
printf("%.2lf\n", a[j][n+1]);
}
else if(2 == flag) puts("Infinite group solutions");
else puts("No solution");
return 0;
}
算法1
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla