各类典例模板

各类典例模板

分数加法(重载加号)

关于重载加号运算符,如果得到的最后还为一个类,记得返回return 类名(参数1,参数2)

FS operator+(FS &f)
#include<bits/stdc++.h>
using namespace std;
class FS{
	private:
		int fz;
		int fm;
	public:
		FS(){}//必须写上无参构造 
		FS(int fenzi,int fenmu)
		{
			fz=fenzi;
			fm=fenmu;
		}
		FS operator+(FS &f)
		{
			int fenmu=f.fm*fm;
			int fenzi=f.fz*fm+f.fm*fz;
			int a=measure(fenzi,fenmu);//求最大公约数; 
			fenmu/=a;
			fenzi/=a;
			if(fenmu<0)
			{
				fenzi=-fenzi;
				fenmu=-fenmu;//如果结果为负数,那么分子取负数,分母取正数 
			}
			return FS(fenzi,fenmu);
		}
		int measure(int x,int y)
		{
			int z=y;
			while(x%y!=0)
			{
				z=x%y;
				x=y;
				y=z;
			}
			return z;
		}
		void display()
		{
			cout<<fz<<"z"<<fm<<"m"<<endl;
		}
};
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int a1,a2,b1,b2;
		char c1,c2;
		cin>>a1>>c1>>b1>>c2;
		cin>>a2>>c1>>b2>>c2;
		FS f1(a1,b1);
		FS f2(a2,b2);
		FS f3=f1+f2;
		f3.display();
	}
}
//1.成员函数重载+号
	Person operator+(Person &p)
	{
		Person temp;
		temp.m_A=this->m_A+p.m_A;
		temp.m_B=this->m_B+p.m_B;
		return temp; 
	} 

//2.全局函数重载+号	
Person operator+(Person &p1,Person &p2)
	{
		Person temp;
		temp.m_A=p1.m_A+p2.m_A;
		temp.m_B=p1.m_B+p2.m_B;
		return temp; 
	} 

重载<< >>

friend ostream& operator<<(ostream& os,Complex& a)  //重载<<运算符
    {
        os<<a.real<<' '<<a.imag<<'i';
        return os;
    }
    
friend istream& operator>>(istream& in,Complex& a)
    {
    	in>>a.real>>a.imag;
    	return in;
	}

重载递增运算符

//重载前置++运算符 返回引用是为了对一个数据一直做递增操作 
//前置递增返回的是引用 
MyInteger& operator++()
{
	//先进行++运算 
	m_Num++;
	//再将自身做返回 
	return *this;
}
//重载后置++运算符 
//int代表占位参数,可以用于区分前置和后置 
//后置递增返回的是值 
MyInteger operator++(int)//后置运算符要记得用int做一个占位符
{
	//先 记录当前结果 
	MyInteger temp=*this;
	//后 递增 
	m_Num++;
	//最后将记录的结果做返回操作 
	return temp;
		}

求最大公约数的方法

int measure(int x,int y)
		{
			int z=y;
			while(x%y!=0)
			{
				z=x%y;
				x=y;
				y=z;
			}
			return z;
		}

比较复数的模(重载大于号)

大于号的重载主要是判断true or false,所以用bool

bool operator >(FS &p)
#include<bits/stdc++.h>
using namespace std;
class FS{
	private:
		int real;
		int image;
	public:
		FS(){}
		FS(int r,int i)
		{
			real=r;
			image=i;
		} 
		bool operator >(FS &p)
		{
			int sum1=real*real+image*image;
			int sum2=p.real*p.real+p.image*p.image;
			if(sum1>sum2)
				return true;
			else
				return false;
		}
};
int main()
{
	int r1,i1,r2,i2;
	while(1)
	{
		cin>>r1>>i1>>r2>>i2;
		if(r1==0&&i1==0&&r2==0&&i2==0)	break;
		FS p1(r1,i1);
		FS p2(r2,i2);
		if(p1>p2)
			cout<<"true"<<endl;
		else
			cout<<"false"<<endl;
	}
}

复数相加 有空再看

#include<iostream>
using namespace std;
class Complex{
    private:
    int real;
    int image;
    public:
    Complex(int a=0,int b=0):real(a),image(b){};
    void display();       //输出使用函数
    void get(int ,int );       //设置私有成员大小
    friend Complex operator+(const Complex &c1,const Complex &c2);   //重载+运算符
};
Complex operator+(const Complex &c1,const Complex &c2){
 Complex c3;
 c3.real=(c1.real+c2.real);           //重载+实现
 c3.image=(c1.image+c2.image);
 return c3;
}
void Complex::get(int a,int b){
    real=a;                            //设置大小
    image=b;
}
void Complex::display(){       //输出函数
    if(real!=0&&image>0){
     if(image!=1){
             cout<<real<<"+"<<image<<"i"<<endl;
  }else{                                           //注意虚数是1或者-1的时候不能直接输出虚数
    cout<<real<<"+"<<"i"<<endl;
  }
    }else if(real!=0&&image<0){
     if(image!=-1){
       cout<<real<<image<<"i"<<endl;
  }else{
   cout<<real<<"-i"<<endl;
  }
    }else if(real!=0&&image==0){
        cout<<real<<endl;
    }else if(real==0&&image==0){
        cout<<"0"<<endl;
    }else if(real==0&&image>0){
     if(image!=1){
      cout<<image<<"i"<<endl;
  }else{
   cout<<"i"<<endl;
  }
    }else if(real==0&&image<0){
     if(image!=-1){
      cout<<image<<"i"<<endl;
  }else{
   cout<<"-i"<<endl;
  }
    }
}
void getnumber(string s,int &a,int &b){     //难点,输入字符串,a,b,来返回具体实数虚数的大小
    int i,j,k;
    a=0;
    b=0;
    int count1=0,count2=0;
    int flag1=0,flag2=0;   
    for(i=0;i<s.size();i++){
        if(s[i]=='i'){
            flag2=1;    //flag2代表i出现出现个数
        }
    }
    for(i=0;i<s.size();i++){
        if(s[i]=='+'){
            count1++;      //count1,count2记录+-个数
        }
        if(s[i]=='-'){
            count2++;
        }
    }
    if(count2==2){
        int flag=0;
        for(i=1;i<s.size();i++){
            if(s[i]=='-'){
                i++;
                break;
            }
            a=(s[i]-'0')+a*10;
        }
        for(;i<s.size();i++){       //负实负虚 
            if(s[i]=='i'){
                break;
            }
            b=(s[i]-'0')+b*10;
            flag++;
        }
        a=-a;
        if(flag==0){
            b=1;
        }
        b=-b;
    }else if(count1==0&&count2==0){
     a=0;
        b=0;
        int flag=0;
        if(flag2==0){
         for(i=0;i<s.size();i++){  //纯正实数 
            a=(s[i]-'0')+a*10;
        }
  }else if(flag2==1){
   for(i=0;i<s.size()-1;i++){
    b=(s[i]-'0')+b*10;       //纯正虚数 
    flag++;
   }
   if(flag==0){
    b=1;
   }
  }
        
    }else if(count1==1&&count2==0){
     a=0;
     b=0;
     int flag=0;
        for(i=0;i<s.size();i++){
            if(s[i]=='+'){                //正实正虚 
                i++;
                break;
            }
            a=(s[i]-'0')+a*10;
        }
        for(;i<s.size();i++){
            if(s[i]=='i'){
                break;
            }
            b=(s[i]-'0')+b*10;
            flag++;
        }
        if(flag==0){
         b=1;
  }
 
    }else if(count1==0&&count2==1){
     a=0;
     b=0;
     int flag=0;
     if(flag2==1){
      if(s[0]=='-'){
       for(i=1;i<s.size()-1;i++){
        b=(s[i]-'0')+b*10;
        flag++;                   //纯负虚数 
    }
    if(flag==0){
     b=1;
    }
    b=-b;
   }else{
  for(i=0;i<s.size();i++){
            if(s[i]=='-'){
                i++;
                break;                       //正实负虚 
            }
            a=(s[i]-'0')+a*10;
        }
        for(;i<s.size()-1;i++){
         flag++;
            b=(s[i]-'0')+b*10;
        }
        if(flag==0){
         b=1;
  }
        b=-b;
      }
 }else{
  a=0;
  b=0;
  for(i=1;i<s.size();i++){         //纯负实数 
   a=(s[i]-'0')+a*10;
  }
  a=-a;
 }    
    }else if(count1==1&&count2==1){
     a=0;
     b=0;
     int flag=0;
     for(i=1;i<s.size();i++){
      if(s[i]=='+'){               //负实正虚 
       i++;
       break;
   }
   a=(s[i]-'0')+a*10; 
  }
  for(;i<s.size()-1;i++){
   flag++;
   b=(s[i]-'0')+b*10;
  }
  a=-a;
  if(flag==0){
   b=1;
  }
 }
}
int main(){            //接下来直接调用函数即可,本题判断字符串输入的函数写得不是很好比较复杂
    Complex c1,c2;     //但是思路应该是没有问题,如果自己有更好的方法可以无视本文的方法哈!
    string s1,s2;
    int a=0,b=0,c=0,d=0;
    cin>>s1;
    getnumber(s1,a,b);
    c1.get(a,b);
    while(1){
    cin>>s2;
    if(s2=="0"){
     break;
 }
    getnumber(s2,c,d);
    c2.get(c,d);
    c1=c1+c2;
 }
    c1.display();
    return 0;
}

复数相乘

#include<iostream>
using namespace std;
class complex
{
    private:
        int real;
        int imag;
    public:
        void set(int r,int i)
        {
            real=r;
            imag=i;
        }
        friend complex operator *(complex &c1,complex &c2);
        void display();
 
};
 
complex operator *(complex &c1,complex &c2)
{
    int re,im;
    complex c3;
    c3.real=c1.real*c2.real-(c1.imag*c2.imag);
    c3.imag=c1.real*c2.imag+c1.imag*c2.real;
    return c3;
}
void complex::display()
{
    if(imag<0)
    {
        if(imag==-1)
        {           
            if(real==0)
            {
                cout<<"-i"<<endl;
            }
            else
            {
                cout<<real<<"-i"<<endl;
            }
 
        }
        
        else
        {
            if(real==0)
            {
                cout<<imag<<"i"<<endl;
            }
            else
            {
                cout<<real<<imag<<"i"<<endl;
            }
        }
    }
    
    else if(imag>0)
    {
        if(imag==1)
        {
            if(real==0)
            {
                cout<<"i"<<endl;
            }
            else
 
            {
                cout<<real<<"+i"<<endl;
            }
        }
        
        else
        {
            if(real==0)
            {
                cout<<imag<<"i"<<endl;
            }
            else
            {
                cout<<real<<"+"<<imag<<"i"<<endl;
            }
        }
 
    }
    
    if(imag==0)
    {
        cout<<real<<endl;
    }
 
}
 
int main()
{
    complex a,b,c;
    string str[3];
    int re[20]= {0},im[20]= {0};
    for(int i=0; i<2; i++)
    {
        int count5=1;
        cin>>str[i];
        int o=0;
        int k=-1;
        
        if(str[i][str[i].size()-1]!='i')
        {
            for(int l=str[i].size()-1; l>=0; l--)
            {
                re[i]=str[i][l]-'0';
            }
        }
        
        else
        {
            for(int j=0; j<str[i].size(); j++)
            {
 
                if(str[i][j]=='-')
                {
                    k=j;
                }
                if(str[i][j]=='+')
                {
                    o=1;
                }
            }
            
            if(o==0&&k==-1)
            {
                re[i]=0;
                
                if(str[i][str[i].size()-1]==str[i][0])
                {
                    im[i]=1;
                }
                
                else
                {
                    for(int l=str[i].size()-2; l>=0; l--)
                    {
                        im[i]+=(str[i][l]-'0')*count5;
                        count5*=10;
                    }
                }
                
            }
            
            else if(o==0&&k==0)
            {
                if(str[i]=="-i")
                {
                    im[i]=1;
                }
                else
                {
                    for(int l=str[i].size()-2; l>0; l--)
                    {
                        im[i]+=(str[i][l]-'0')*count5;
                        count5*=10;
                    }
                }
                im[i]=-1*im[i];
                
            }
 
            else
            {
                for(int j=0; j<str[i].size(); j++)
                {
                    int count1=1;
                    int count2=1;
                    int count3=1;
                    int count4=1;
                    if(str[i][j]=='+')
                    {
                        for(int t=j-1; t>=0; t--)
                        {
                            re[i]+=(str[i][t]-'0')*count1;
                            count1*=10;
                        }
                        if(str[i][j+1]=='i')
                        {
                            im[i]=1;
                        }
                        else
                        {
                            for(int t=str[i].size()-2; t>j; t--)
                            {
                                im[i]+=(str[i][t]-'0')*count2;
                                count2*=10;
                            }
                        }
 
                    }
                    if(str[i][j]=='-'&&j!=0)
                    {
                        for(int t=j-1; t>=0; t--)
                        {
                            re[i]+=(str[i][t]-'0')*count3;
                            count3*=10;
                        }
                        if(str[i][j+1]=='i')
                        {
                            im[i]=1;
                        }
                        else
                        {
                            for(int t=str[i].size()-2; t>j; t--)
                            {
                                im[i]+=(str[i][t]-'0')*count4;
                                count4*=10;
                            }
                        }
                        im[i]=-1*im[i];
                    }
                    if(str[i][0]=='-')
                    {
                        re[i]=-1*re[i];
                    }
                }
 
            }
        }
    }
    a.set(re[0],im[0]);
    b.set(re[1],im[1]);
    c=a*b;
    c.display();
    return 0;
}

矩阵乘法

//7.7
#include<iostream>
#include<iomanip>
using namespace std;
class matrix{
	private:
		int row;
		int column;
		int **mat;
	public:
		matrix(){}
		void read()
		{
			for(int i=0;i<row;i++)
			{
				for(int j=0;j<column;j++)
					cin>>mat[i][j];
			}
		}
		matrix(int a,int b)//要先给数组申请内存单元 
		{
			row=a;
			column=b;
			mat= new int*[row];
			for(int i=0;i<row;i++)
			{
				mat[i]=new int[column];
				for(int j=0;j<column;j++)
					mat[i][j]=0;
			}
		}
		void display()
		{
			for(int i=0;i<row;i++)
			{
				for(int j=0;j<column;j++)
					cout<<setw(10)<<mat[i][j];
				cout<<endl;
			}
		}
		matrix operator*(matrix& mt)
		{
			if(this->row==1&&this->column==1)
			{
				for(int i=0;i<mt.row;i++)
				{
					for(int j=0;j<mt.column;j++)
					{
						mt.mat[i][j]=this->mat[0][0]*mt.mat[i][j];
					}
				}
				return mt;
			}
			else
			{
				matrix rs(this->row,mt.column);
				for(int i=0;i<this->row;i++)
				{
					for(int j=0;j<mt.column;j++)
					{
						for(int k=0;k<mt.row;k++)
							rs.mat[i][j]+=this->mat[i][k]*mt.mat[k][j];
					}
				}
			return rs;	
			}
			
		}
};

int main()
{
	int row1,column1,row2,column2;
	cin>>row1>>column1;
	matrix p1(row1,column1);
	p1.read();
	cin>>row2>>column2;
	matrix p2(row2,column2);
	p2.read();
	if(column1==row2||column1==1&&row1==1||column2==1&&row2==1)
	{
		matrix p3=p1*p2;
		p3.display();	
	}
	else
		cout<<"Invalid Matrix multiplication!"<<endl;
}

说反话

#include<iostream>
#include<cstring>
using namespace std;
const int n=500005;
int main()
{
    char str[n];
    char s[n];
    cin.getline(str,n);
    int length=strlen(str);
    int j;
    int k=0;
    int flag=0;
    for(int i=length-1;i>=0;i--)
    {
        if(str[i]==' '&&str[i+1]!=' '||i==0&&str[i]!=' ')
        { 
			if(i!=0)
				j=i+1;
			else
				j=i;
            int x=0;
        	while(1)
			{
	            if(str[j]!=' '&&j!=length)
	               {
						s[k]=str[j];
						j++;
						k++;
                        x=1;
//						if(i!=0)
//							flag=1;
					} 
	            else 
				{
					break;
				}
			}
        if(x==1)
        {
        s[k]=' ';
		k++;  
        }
		continue;
        }
    }
    for(int i=0;i<k-1;i++)
    	cout<<s[i];
    return 0;}
posted @ 2021-07-01 20:29  小滢小滢考第一名  阅读(72)  评论(0编辑  收藏  举报