C++实现线性代数矩阵行简化

所属分类: 软件编程 / C 语言 阅读数: 103
收藏 0 赞 0 分享

本文实例为大家分享了C++实现线性代数矩阵行简化的具体代码,供大家参考,具体内容如下

输入一个矩阵,可分别输出该矩阵的阶梯型和最简型。

输入仅支持整数,支持分数形式输出。

妈妈再也不用担心俺的线性代数作业~

使用实例:

(实现格式化输出部分写的极为丑陋......)

#include<iostream>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<cstdio>
#include<string>
#define f(i,l,r) for(i=(l);i<=(r);i++)
#define ff(i,r,l) for(i=(r);i>=(l);i--)
#define ll long long
#define EPS 1e-6
using namespace std;
const int MAXN=105;
int n,m;
char output[MAXN];
string s;
struct frac{
  int x,y=1;
  bool operator < (const frac &tmp)const{
    return 1.0*x/y<1.0*tmp.x/tmp.y;
  }
  frac operator - (const frac &tmp){
    frac ans;
    ans.x=x*tmp.y-y*tmp.x;
    ans.y=y*tmp.y;
    ans.sim();
    return ans;
  }
  frac operator * (const frac &tmp){
    frac ans;
    ans.x=x*tmp.x;
    ans.y=y*tmp.y;
    ans.sim();
    return ans;
  }
  frac operator / (const frac &tmp){
    frac ans;
    ans.x=x*tmp.y;
    ans.y=y*tmp.x;
    ans.sim();
    return ans;
  }
  int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
  }
  void sim(){
    int d=gcd(x,y);
    x/=d;
    y/=d;
    if(x<0&&y<0){
      x=-x;
      y=-y;
    }
  }
  void write()
  {
    int i;
    char tmp[MAXN];
    int num=0;
    int nx=x,ny=y;
    s="";
    if(!nx){
      s+="0";
    }
    else{
      if(nx<0||ny<0){
        s+='-';
        nx=abs(nx);
        ny=abs(ny);
      }
      if(nx%ny==0){
        nx/=ny;
        while(nx){
          tmp[++num]='0'+nx%10;
          nx/=10;
        }
        ff(i,num,1){
          s+=tmp[i];
        }
      }
      else{
        while(nx){
          tmp[++num]='0'+nx%10;
          nx/=10;
        }
        ff(i,num,1){
          s+=tmp[i];
        }
        s+='/';
        num=0;
        while(ny){
          tmp[++num]='0'+ny%10;
          ny/=10;
        }
        ff(i,num,1){
          s+=tmp[i];
        }
      }
    }
    f(i,s.length(),7){
      cout<<" ";
    }
    cout<<s;
  }
}a[MAXN][MAXN];
void out_f()
{
  int i,j;
  f(i,1,n){
    f(j,1,m){
      cout<<1.0*a[i][j].x/a[i][j].y<<" ";
    }
    cout<<endl;
  }
}
void out()
{
  int i,j;
  f(i,1,n){
    f(j,1,m){
      a[i][j].write();
      cout<<" ";
    }
    cout<<endl;
  }
}
int find(int r,int c)
{
  int i,t=-1;
  f(i,r,n){
    if(t==-1||a[t][c]<a[i][c]) t=i;
  }
  return t;
}
void interchange(int r1,int r2)
{
  int j;
  f(j,1,m){
    swap(a[r1][j],a[r2][j]);
  }
  return;
}
void scale(int r,int c)
{
  int j;
  ff(j,m,c){
    a[r][j]=a[r][j]/a[r][c];
  }
  return;
}
void muilt(int r,int c)
{
  int i,j;
  f(i,r+1,n){
    if(!a[i][c].x) continue;
    ff(j,m,c){
      a[i][j]=a[i][j]-(a[i][c]*a[r][j]);
    }
  }
  return;
}
void gause_1()
{
  int c,r=1;
  f(c,1,n){
    int pos=find(r,c);
    if(!a[pos][c].x) continue;
    interchange(r,pos);
    scale(r,c);
    muilt(r,c);
    r++;
  }
}
void gause_2()
{
  int i,j;
  ff(i,n,1){
    f(j,i+1,n){
      a[i][n+1]=a[i][n+1]-(a[i][j]*a[j][n+1]);
      a[i][j].x=0;
    }
  }
  return;
}
int main()
{
  int i,j;
  cout<<"输入矩阵的行数和列数:"<<endl;
  cin>>n>>m;
  cout<<"输入矩阵元素:"<<endl;
  f(i,1,n){
    f(j,1,m){
      cin>>a[i][j].x;
    }
  }
  gause_1();
  cout<<"阶梯型为:"<<endl;
  out();
  gause_2();
  cout<<"最简型为:"<<endl;
  out();
  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

用标准c++实现string与各种类型之间的转换

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0 赞 0 分享

C++如何通过ostringstream实现任意类型转string

再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
收藏 0 赞 0 分享

C/C++指针小结

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0 赞 0 分享

C++ 类的静态成员深入解析

在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0 赞 0 分享

C++类的静态成员初始化详细讲解

通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0 赞 0 分享

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0 赞 0 分享

C++中的friend友元函数详细解析

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0 赞 0 分享

static全局变量与普通的全局变量的区别详细解析

以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
收藏 0 赞 0 分享

C++ explicit关键字的应用方法详细讲解

C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0 赞 0 分享

教你5分钟轻松搞定内存字节对齐

随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0 赞 0 分享
查看更多