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;
}

完结撒花!!!!!!!!!!!!!!!!!!!!!!!!

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值