各类典例模板
各类典例模板
分数加法(重载加号)
关于重载加号运算符,如果得到的最后还为一个类,记得返回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;}