洛谷P 3389朴素的高斯消元和高斯约旦消元


 // 约旦消元相比朴素高斯消元,代码量少,而且都能判无解,无穷解,唯一解;无穷解是代码中判,结束后如果a[i][i]==0&&a[i][n+]!=0无解,否则唯一解
1
#include 2 using namespace std; 3 4 int main() 5 { 6 int n; 7 scanf("%d",&n); 8 double a[105][105]; 9 memset(a,0,sizeof(a)); 10 for(int i=1;i<=n;i++) 11 for(int j=1;j<=n+1;j++) 12 { 13 int t; 14 scanf("%d",&t); 15 a[i][j]=t; 16 } 17 /*for(int i=1;i<=n;i++) 18 { 19 for(int j=1;j<=n+1;j++)cout<20 cout<21 }*/ 22 for(int i=1;i<=n;i++) 23 { 24 if(!a[i][i]) 25 { 26 for(int j=i+1;j<=n;j++) 27 if(a[j][i]) 28 { 29 for(int k=1;k<=n+1;k++)swap(a[i][k],a[j][k]); 30 break; 31 } 32 } 33 for(int j=i+1;j<=n;j++) 34 { 35 double t=a[j][i]/a[i][i]; 36 for(int k=1;k<=n+1;k++) 37 a[j][k]=a[j][k]-a[i][k]*t; 38 } 39 } 40 41 42 bool ok=false; 43 if(a[n][n]==0&&a[n+1][n+1]==0)ok=true; 44 if(ok)printf("No Solution\n"); 45 else 46 { 47 for(int i=n;i;i--) 48 { 49 for(int j=n;j>=i+1;j--) 50 { 51 a[i][j]*=a[j][n+1]; 52 a[i][n+1]-=a[i][j]; 53 } 54 a[i][n+1]/=a[i][i]; 55 } 56 for(int i=1;i<=n;i++) 57 printf("%.2lf\n",a[i][n+1]); 58 } 59 60 return 0; 61 }


 1 #include
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int n;
 7     scanf("%d",&n);
 8     double a[105][105];
 9     memset(a,0,sizeof(a));
10     for(int i=1;i<=n;i++)
11     for(int j=1;j<=n+1;j++)scanf("%lf",&a[i][j]);
12 
13     for(int i=1;i<=n;i++)
14     {
15         if(!a[i][i])
16         {
17             bool ok=false;
18             for(int j=i+1;j<=n;j++)
19             if(a[j][i])
20             {
21                 for(int k=1;k<=n+1;k++)swap(a[i][k],a[j][k]);
22                 ok=true;
23                 break;
24             }
25             if(!ok)
26             {
27                 puts("No Solution");
28                 return 0;
29             }
30             
31         }
32         for(int j=1;j<=n;j++)
33         {
34             if(j==i)continue;
35             double t=a[j][i]/a[i][i];
36             for(int k=1;k<=n+1;k++)
37             a[j][k]=a[j][k]-a[i][k]*t;
38         }
39     }
40     
41     
42     for(int i=1;i<=n;i++)
43     printf("%.2lf\n",a[i][n+1]/a[i][i]);
44     
45     return 0;
46 }

相关