接上一篇隨筆,利用克拉莫法則求解n元線性方程組。
代碼:
1 #include <iostream>
2 #include <cmath>
3 using namespace std;
4 void appDescribe(); //程序說明
5 double valDet( double* detPtr, int rank); //求解行列式
6 class LinearEquations
7 {
8 public:
9 LinearEquations(); //構造方程組
10 void sol(); //求解
11 void showAns(); //顯示解
12 private:
13 int rank; //階數
14 double* parPtr; //系數行列式
15 double* conPtr; //常數項
16 double* ansPtr; //解
17 };
18 LinearEquations::LinearEquations()
19 {
20 cout<<"輸入方程元數:";
21 cin>>rank;
22 int rank2=rank*rank;
23 parPtr=new double[rank2];
24 conPtr=new double[rank];
25 cout<<endl<<"輸入系數行列式:"<<endl;
26 for(int i=0;i<rank2;i++)
27 cin>>parPtr[i];
28 cout<<endl<<"輸入常數項:"<<endl;
29 for(int i=0;i<rank;i++)
30 cin>>conPtr[i];
31 }
32 void LinearEquations::sol()
33 {
34 int rank2=rank*rank;
35 double det=valDet(parPtr,rank);
36 ansPtr=new double[rank];
37 double *tempParptr=new double[rank2];
38 double tempDet;
39 if(det==0)
40 {
41 ansPtr=NULL;
42 return;
43 }
44 for(int i=0;i<rank;i++)
45 {
46 for(int j=0;j<rank2;j++)
47 tempParptr[j]=parPtr[j];
48 for(int j=0;j<rank;j++)
49 tempParptr[i+j*rank]=conPtr[j];
50 tempDet=valDet(tempParptr,rank);
51 ansPtr[i]=tempDet/det;
52 }
53 }
54 void LinearEquations::showAns()
55 {
56 if(ansPtr==NULL)
57 {
58 cout<<"該線性方程組無解或有無數解"<<endl;
59 return;
60 }
61 cout<<endl<<"該線性方程組的解為:"<<endl;
62 for(int i=0;i<rank;i++)
63 cout<<'x'<<i+1<<':'<<ansPtr[i]<<endl;
64 }
65 int main()
66 {
67 appDescribe();
68 LinearEquations l1;
69 l1.sol();
70 l1.showAns();
71 system("pause");
72 return 0;
73 }
74 void appDescribe()
75 {
76 cout<<"***************************************"<<endl
77 <<"本程序利用克拉莫法則求解n元線性方程組。"<<endl
78 <<"案例:"<<endl
79 <<"輸入方程元數:4"<<endl<<endl
80 <<"輸入系數行列式:"<<endl
81 <<"1 1 1 1"<<endl
82 <<"1 2 -1 4"<<endl
83 <<"2 -3 -1 -5"<<endl
84 <<"3 1 2 11"<<endl<<endl
85 <<"輸入常數項:"<<endl
86 <<"5 -2 -2 0"<<endl<<endl
87 <<"該線性方程組的解為:"<<endl
88 <<"x1:1"<<endl
89 <<"x2:2"<<endl
90 <<"x3:3"<<endl
91 <<"x4:-1"<<endl
92 <<"***************************************"<<endl;
93 }
94 double valDet( double* detPtr, int rank)
95 {
96 double val=0;
97 if(rank==1) return detPtr[0];
98 for(int i=0;i<rank;i++) //計算余子式保存在nextDetPtr[]中
99 {
100 double *nextDetPtr=new double[(rank-1)*(rank-1)];
101 for(int j=0;j<rank-1;j++)
102 for(int k=0;k<i;k++)
103 nextDetPtr[j*(rank-1)+k]=detPtr[(j+1)*rank+k];
104 for(int j=0;j<rank-1;j++)
105 for(int k=i;k<rank-1;k++)
106 nextDetPtr[j*(rank-1)+k]=detPtr[(j+1)*rank+k+1];
107 val+=detPtr[i]*valDet(nextDetPtr,rank-1)*pow(-1.0,i);
108 }
109 return val;
110 }
111 /*
112 數據1:
113 2
114
115 1 2
116 2 1
117
118 3 3
119 數據2:
120 4
121
122 1 1 1 1
123 1 2 -1 4
124 2 -3 -1 -5
125 3 1 2 11
126
127 5 -2 -2 0
128 */