1. 程式人生 > >「LuoguP3389」【模板】高斯消元法

「LuoguP3389」【模板】高斯消元法

題目背景

Gauss消元

題目描述

給定一個線性方程組,對其求解

輸入輸出格式

輸入格式:

 

第一行,一個正整數 nn

第二至 n+1n+1行,每行 n+1n+1 個整數,為a_1, a_2 \cdots a_na1,a2an 和 bb,代表一組方程。

 

輸出格式:

 

共n行,每行一個數,第 ii行為 x_ixi (保留2位小數)

如果不存在唯一解,在第一行輸出"No Solution".

 

輸入輸出樣例

輸入樣例#1:  複製
3
1 3 4 5
1 4 7 3
9 3 2 2
輸出樣例#1:  複製
-0.97
5.18
-2.39

說明

1 \leq n \leq 100, \left | a_i \right| \leq {10}^4 , \left |b \right| \leq {10}^41n100,ai104,b104

題解

這個東西從寒假拖到現在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 }

 (反正也不考裸題 難的又看不出來 不知道我寫個什麼玩意兒