
c++重载运算符 (结构体)
c++函数重载(结构体)
·
你是不是还在为高精度而烦恼,是不是还不会封装高精度函数。
今天,我们来学习一个新的简单的东西,重载运算符。
首先先看
#include<bits/stdc++.h>
using namespace std;
struct gg{long long x;}; //输入2 3
int main() //输出5
{
gg a,b,c;
cin>>a.x>>b.x;
c.x=a.x+b.x;
cout<<c.x;
return 0;
}
这是一个平平无奇的a+b,输入两个值,输出他们的和
当我们弄上重载运算符
#include<bits/stdc++.h>
using namespace std;
struct gg
{
long long x;
gg operator+(gg &y)
{
gg tmp;
tmp.x=114514;
return tmp;
}
};
int main()
{
gg a,b,c;
cin>>a.x>>b.x;
c=a+b;
cout<<c.x;
return 0;
}
惊人的发现,输入的两个值的和竟然一直都是一串臭的数字!
让我们来看一下它们之间不同的地方
gg operator+(gg &y)
{
gg tmp;
tmp.x=114514;
return tmp;
}
多一个函数
- 函数类型是gg(结构体名) 因为我们的表达式是c=a+b,c是gg类型的。
- 函数名operator+ 意思是 重载一个字符 ;用法 operator 字符。
- 调用了一个gg类型的参数 加上地址符表示引用 这在表达式中引用的是 b。
- 新建了一个gg类型的tmp。
- tmp.x=114514 将结果设为定值。
- 返回tmp,将tmp赋值给c。
通过这个函数,我们重载了加法运算,返回相加的结果都是tmp(114514)。
所以我们可以通过改变运算符来达到不同的效果,这个过程就是重载运算符。
那可以我们利用一下重载函数搞些好玩的
理论存在,魔法开始
#include<bits/stdc++.h>
using namespace std;
struct gg //定义结构体
{
long long a[100000];
gg() //初始化
{
memset(a,0,sizeof(a));
}
void bian(string x) //字符串转整型数组
{
long long len=x.size();
for(long long i=1;i<=len;i++)
{
a[i]=x[len-i]-'0';
}
a[0]=len; //a[0]保存长度
return;
}
gg operator+(gg &y) //重载加法
{
gg tmp;
long long z=0;
tmp.a[0]=max(a[0],y.a[0]);
for(long long i=1;i<=tmp.a[0];i++) //高精度加法
{
tmp.a[i]=a[i]+y.a[i]+z;
z=tmp.a[i]>9;
tmp.a[i]%=10;
}
if(z>0) tmp.a[++tmp.a[0]]=z;
return tmp; //返回两个数的和
}
};
gg n1,n2,n3;
int main()
{
string s1,s2;
cin>>s1>>s2; //输入2个字符串
n1.bian(s1);
n2.bian(s2); //把字符串转为整型数组
n3=n1+n2; //相加
for(long long i=n3.a[0];i>=1;i--) //输出(a[0]是长度)
{
cout<<n3.a[i];
}
return 0;
}
这里我们运用了运算符重载,将普通加法变为高精度加法,只用n1+n2就能实现高精度,方便很多。
我们运用一下上面的加法重载,可以实现高精度版斐波那契数列
见下
#include<bits/stdc++.h>
using namespace std;
struct gg //定义结构体
{
long long a[100000];
gg() //初始化
{
memset(a,0,sizeof(a));
}
void bian(string x) //字符串转整型数组
{
long long len=x.size();
for(long long i=1;i<=len;i++)
{
a[i]=x[len-i]-'0';
}
a[0]=len; //a[0]保存长度
return;
}
gg operator+(gg &y) //重载加法
{
gg tmp;
long long z=0;
tmp.a[0]=max(a[0],y.a[0]);
for(long long i=1;i<=tmp.a[0];i++) //高精度加法
{
tmp.a[i]=a[i]+y.a[i]+z;
z=tmp.a[i]>9;
tmp.a[i]%=10;
}
if(z>0) tmp.a[++tmp.a[0]]=z;
return tmp; //返回两个数的和
}
};
gg n1,n2,n3;
int main()
{
long long n;
cin>>n;
n1.a[1]=0,n2.a[1]=1; //数列的第一个数为1,第二个数为1
n1.a[0]=1,n2.a[0]=1; //2个数的长度各为1
if(n==1) cout<<1;
if(n==2) cout<<1;
for(long long i=3;i<=n;i++) //斐波那契
{
n3=n1+n2;
n1=n2;
n2=n3;
}
for(long long i=n3.a[0];i>=1;i--) //输出
{
cout<<n3.a[i];
}
return 0;
}
完结撒花!!!!!!!!!!!!!!!!!!!!!!!!
更多推荐
所有评论(0)