题目背景
Gauss消元
题目描述
给定一个线性方程组,对其求解
输入输出格式
输入格式:
第一行,一个正整数 nn
第二至 n+1n+1行,每行 n+1n+1 个整数,为a_1, a_2 \cdots a_na1,a2⋯an 和 bb,代表一组方程。
输出格式:
共n行,每行一个数,第 ii行为 x_ixi (保留2位小数)
如果不存在唯一解,在第一行输出"No Solution".
输入输出样例
说明
1 \leq n \leq 100, \left | a_i \right| \leq {10}^4 , \left |b \right| \leq {10}^41≤n≤100,∣ai∣≤104,∣b∣≤104
题解
这个东西从寒假拖到现在qwq
大概是自己变强了吧,觉得写起来蛮轻松的qwq
1 /* 2 qwerta 3 P3389 【模板】高斯消元法 Accepted 4 100 5 代码 C++,0.95KB 6 提交时间 2018-11-02 07:49:21 7 耗时/内存 36ms, 800KB 8 */ 9 #include<iostream> 10 #include<cstdio> 11 #include<cmath> 12 using namespace std; 13 double a[103][104]; 14 bool sf[103]; 15 int pos[103]; 16 double ans[103]; 17 int main() 18 { 19 //freopen("a.in","r",stdin); 20 ios::sync_with_stdio(false); 21 int n; 22 cin>>n; 23 for(int i=1;i<=n;++i) 24 for(int j=1;j<=n+1;++j) 25 cin>>a[i][j]; 26 for(int s=1;s<=n;++s) 27 { 28 int mac=0,macc=-1e4-2333;//mac记录系数绝对值最大的行号,macc记录绝对值 29 for(int i=1;i<=n;++i) 30 if(!sf[i])//如果这一行没有被选过 31 { 32 if(abs(a[i][s])>macc) 33 { 34 mac=i, 35 macc=a[i][s]; 36 } 37 } 38 if(abs(a[mac][s])<1e-7){cout<<"No Solution";return 0;}//绝对值最大的系数为0,则无解 39 double c=a[mac][s];//c为最大行第一个非零项的系数 40 pos[s]=mac;//第s个未知数的结果在第mac行 41 sf[mac]=1;//打个被选过的标记 42 for(int j=s;j<=n+1;++j)//先把最大行化简 43 { 44 a[mac][j]/=c; 45 } 46 for(int i=1;i<=n;++i) 47 if(i!=mac) 48 { 49 double c=a[i][s]/a[mac][s]; 50 for(int j=s;j<=n+1;++j) 51 a[i][j]-=a[mac][j]*c;//把第i行的首项化到跟mac行一样,再减掉mac行的当前项 52 } 53 /* 54 for(int i=1;i<=n;++i) 55 { 56 for(int j=1;j<=n+1;++j) 57 cout<<a[i][j]<<" "; 58 cout<<endl; 59 } 60 cout<<endl; 61 */ 62 } 63 for(int i=1;i<=n;++i) 64 ans[i]=a[pos[i]][n+1];//取解 65 for(int i=1;i<=n;++i) 66 printf("%.2f\n",ans[i]); 67 return 0; 68 }
(反正也不考裸题 难的又看不出来 不知道我写个什么玩意儿