我自己由于上线性代数,感觉逆矩阵是个很头痛的问题,所以以后就想偷个懒,每次在寝室做作业就可以直接使用电脑来帮忙了,这样会省下很多的功夫的,当然考试还是要自己做的!!!
废话不多说,上菜吧@-@
当然用到现在也没发现什么bug,如果你在使用的时候出现了bug,可以慢慢的自己调试修改下,如果可以的话,也可以和我qq联系,我们一起加油,欢迎你的访问。
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <memory>
#include<cstring>
using namespace std;
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
struct Fraction//分数类
{
int molecular,denominator;//分别是分子和分母
bool isLegal(){
if(denominator==0)return false;
return true;
}
bool operator==(int a){
return molecular==a;
}
bool operator!=(int a){
return !(molecular==a);
}
Fraction reciprocal(){//求分数的倒数
Fraction f(*this);
if(f.molecular==0)cout<<"分子是0,无法变成倒数"<<endl;
f.molecular=f.molecular^f.denominator;
f.denominator=f.molecular^f.denominator;
f.molecular=f.molecular^f.denominator;
return f;
}
Fraction(int m=1,int d=1)
{
molecular=m;
denominator=d;
simplify();
}
void simplify(){//分数化简
int temp=1;
while((temp=gcd(molecular,denominator))!=1)
{
molecular/=temp;
denominator/=temp;
}
}
Fraction operator/(Fraction f){
Fraction d;
d=f.reciprocal();
return d*(*this);
}
Fraction operator/(int a){
Fraction d;
Fraction f(a,1);
d=f.reciprocal();
return d*(*this);
}
Fraction operator*(Fraction f){
Fraction d(1,1);
d.denominator=denominator*f.denominator;
d.molecular=molecular*f.molecular;
d.simplify();
return d;
}
Fraction operator*(int a){
Fraction d(1,1);
Fraction f(a,1);
d.denominator=denominator*f.denominator;
d.molecular=molecular*f.molecular;
d.simplify();
return d;
}
Fraction operator+(Fraction f){
Fraction d(0,1);
d.denominator=denominator*f.denominator;
d.molecular=molecular*f.denominator+denominator*f.molecular;
d.simplify();
return d;
}
Fraction operator+(int a){
Fraction d(0,1);
Fraction f(a,1);
d.denominator=denominator*f.denominator;
d.molecular=molecular*f.denominator+denominator*f.molecular;
d.simplify();
return d;
}
Fraction operator-(Fraction f){
Fraction d(0,1);
d.denominator=denominator*f.denominator;
d.molecular=molecular*f.denominator-denominator*f.molecular;
d.simplify();
return d;
}
Fraction operator-(int a){
Fraction f(a,1);
Fraction d(0,1);
d.denominator=denominator*f.denominator;
d.molecular=molecular*f.denominator-denominator*f.molecular;
d.simplify();
return d;
}
};
istream&operator>>(istream&is,Fraction &f){//重载分数的输入函数
int t;
is>>t;
f=Fraction(t,1);
return is;
}
ostream&operator<<(ostream &os,Fraction f)//重载分数的输出函数;
{
// os<<"该分数为-----------"<<endl;
// os<<"该分数的分子和分母分别为"<<f.molecular<<"/"<<f.denominator<<endl;
if(f.denominator<0){f.denominator=-f.denominator;f.molecular=-f.molecular;}
if(f.isLegal())
{
os<<f.molecular;
if(f.denominator!=1)
os<<"/"<<f.denominator;
}
return os;
// else os<<"该分数的分子和分母分别为"<<f.molecular<<"/"<<f.denominator<<endl;
// os<<"-----------------------"<<endl;
}
Fraction a[50][50];
int row,col;
void E_divide(int n,Fraction num){//第n行的所有的数都除以一个分数num
for(int i=1;i<=(col<<1);i++)
a[n][i]=a[n][i]/num;
}
void E_add(int n,int c){//第n行的所有的数都加上[对应的这一列的数除以第c行c列(对角线上的数)的数的倍数]乘以[对应的对角线上的数]的乘积,比如对角线上的数是2,第n行的那个数是3,那么第n行的数都减去(3/2)倍的第c行的所有的对应的数。
for(int i=1;i<=row;i++)
if(a[i][c]!=0){
Fraction temp=(Fraction(1,1)/a[i][c]);
for(int j=1;j<=(col<<1);j++)
a[n][j]=a[n][j]+(temp*a[i][j]);
}
}
void E_sub(int n,Fraction num){//第n行所有的数都减去分数num。
for(int i=1;i<=(col<<1);i++)
a[n][i]=a[n][i]-num;
}
void E_2(int n,int c){//
// if(a[c][c]==0){E_sub(n,a[n][c]);return;}
Fraction temp=(a[n][c]/a[c][c]);
for(int i=1;i<=(col<<1);i++)
a[n][i]=a[n][i]-(temp*a[c][i]);
}
int main()
{
// int n,m;
// Fraction f1(1,3),f2(3,2);
// cout<<(f1.reciprocal())<<endl;
// cout<<"f1"<<f1<<endl;
// cout<<"f1-f2"<<f1-f2<<endl;
// cout<<"f2-f1"<<f2-f1<<
// "f1/f2"<<f1/f2<<
// "f1*f2"<<f1*f2<<
"f2/f1"<<f2/f1<<
// "f2*f1"<<(f2*f1)<<endl;
int T=1;
while(true)
{
cout<<"第"<<T++<<"组测试数据:"<<endl;
cout<<"输入矩阵大小(行 列):";
cin>>row>>col;
memset(a,0,sizeof(a));
cout<<"输入矩阵:"<<endl;
for(int i=1;i<=row;i++)
{
for(int j=1;j<=col;j++)
{
cin>>a[i][j];
}
}
cout<<"请问B是单位矩阵吗?(Y/N)"<<endl;
int flag=0;
char str[10];
while(scanf("%s",str)!=EOF){
if(!strcmp(str,"Y")){flag=1;break;}
else if(!(strcmp(str,"N"))){flag=0;break;}
}
if(!flag)
{
for(int i=1;i<=row;i++)
for(int j=col+1;j<=(col<<1);j++)
cin>>a[i][j];
}
else
{
for(int i=1;i<=row;i++)
//在原始矩阵右侧加上特征矩阵
for(int j=col+1;j<=col*2;j++)
a[i][j]=(j-i==col)?(Fraction(1,1)):(Fraction(0,1));
}
cout<<setiosflags(ios::fixed);
// for(int i=1;i<=row;i++)
// {
// for(int j=1;j<=(col<<1);j++)
// cout<<setprecision(4)<<a[i][j]<<'\t';
// cout<<endl;
// }
for(int j=1;j<=col;j++)
{
for(int i=1;i<=row;i++)
{
// cout<<"i="<<i<<":"<<"j="<<j<<endl;
if(a[i][j]==0&&i==j)E_add(i,j);
if(i==j&&a[i][j]!=0&&a[i][j]!=1)E_divide(i,a[i][j]);
if(a[i][j]!=0&&i!=j)
E_2(i,j);
// cout<<"-----------------------------------------------------------------"<<endl;
// for(int i=1;i<=row;i++)
// {
// for(int j=1;j<=(col<<1);j++)
// cout<<setprecision(4)<<a[i][j]<<'\t';
// cout<<endl;
// }
}
}
for(int i=1;i<=row;i++)
{
for(int j=col+1;j<=col*2;j++)
cout<<setprecision(4)<<a[i][j]<<'\t';
cout<<endl;
}
}
system("pause");
return 0;
}
//
//0 0 1 0
//0 2 0 0
//3 0 0 0
//0 0 0 4
//1 0 0
//2 -1 0
//2 1 1