#include <cstdio>
#include <string>
#include<iostream>
#include<algorithm>
#include<cstring>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
struct Data
{
int a[100001],len;//存储每位数的数组和长度
Data()//初始值
{
memset(a, 0, sizeof(a));
len = 1;
}
void read()//读入函数
{
char d[100001];
scanf("%s",d);
int l=strlen(d);
for(int i=1; i<=l; i++)
a[i]=d[l-i]-'0';//倒序存储,方便进位
len=l;//记录长度
}
void write()//输出函数
{
for(int i = len; i>=1; i--)
printf("%d", a[i]);//倒序输出
}
void clean()//去掉前导零
{
while (len>1&&!a[len]) len--;
}
friend bool operator < (const Data &A,const Data & B)//可以定义在外,外面请不要加friend;在内部不加friend,不能用两个参数
{//const防止你改值,别忘了取地址 &
if(A.len>B.len) return 0; //先比长度
if(A.len<B.len) return 1;
for(int i=1;i<=A.len;i++) //再从最高位开始判断
{
if(A.a[i]>B.a[i]) return 0;
if(A.a[i]<B.a[i]) return 1;
}
return 0; //如果一样返回零
}
friend bool operator <= (const Data & A,const Data & B)
{
if(A.len>B.len) return 0;
if(A.len<B.len) return 1;
for(int i=1;i<=A.len;i++)
{
if(A.a[i]>B.a[i]) return 0;
if(A.a[i]<B.a[i]) return 1;
}
return 1; //如果一样返回 1
}
friend bool operator > (const Data & A,const Data & B)
{
if(A.len>B.len) return 1;
if(A.len<B.len) return 0;
for(int i=1;i<=A.len;i++)
{
if(A.a[i]>B.a[i]) return 1;
if(A.a[i]<B.a[i]) return 0;
}
return 0;
}
friend bool operator >= (const Data & A,const Data &B)
{
if(A.len>B.len) return 1;
if(A.len<B.len) return 0;
for(int i=1;i<=A.len;i++)
{
if(A.a[i]>B.a[i]) return 1;
if(A.a[i]<B.a[i]) return 0;
}
return 1;
}
friend bool operator == (const Data & A,const Data &B)
{
if(A.len>B.len) return 0;
if(A.len<B.len) return 0;
for(int i=1;i<=A.len;i++)
{
if(A.a[i]>B.a[i]) return 0;
if(A.a[i]<B.a[i]) return 0;
}
return 1;//长度相等,对应位数相等才相等
}
friend Data operator + (const Data &A,const Data &B)
{
Data C;//因为A,B均不可以改值,所以引入C,C长度1,值为0
C.len = max(B.len, A.len);//选取A,B长度最大的
for(int i = 1 ; i <= C.len; i++)//边界需要注意
{
C.a[i] += A.a[i]+B.a[i];//对应位相加
if(C.a[i] >= 10)//每十进一
{
C.a[i] -= 10;//由于不会超过10,故用 -=10 代替 %10 效率更高
C.a[i+1]++;//进位
}
}
if(C.a[C.len+1])//考虑是否会进到B.len的下一位
C.len++;
C.clean();//去0,即使长度大了也不要紧
return C;
}
friend Data operator - (const Data &A ,const Data &B)
{
Data C;//因为A,B均不可以改值,所以引入C,C长度1,值为0
if( A > B)
{
C.len=A.len;
for(int i=1;i<=A.len;i++)
{
C.a[i]+=A.a[i]-B.a[i];
if(C.a[i]<0)//借位
{C.a[i+1]--;C.a[i]+=10;}
}
if(C.a[C.len+1]) C.len++;
C.clean();
return C;
}
else if(A==B)//防止出现1-1=-0的情况
{
return C;//C的初始长度为1,值为0
}
else if (A<B)
{
cout<<'-';
C.len=B.len;
for(int i=1;i<=B.len;i++)
{
C.a[i]+=B.a[i]-A.a[i];
if(C.a[i]<0)
{C.a[i+1]--;C.a[i]+=10;}
}
if(C.a[C.len+1]) C.len++;
C.clean();
return C;
}
}
friend Data operator * (const Data &A ,const Data &B)
{
Data C;
C.len=A.len+B.len;//C的长度最大为 A.len+B.len,有时 A.len+B.len-1
for(int i=1;i<=A.len;i++)
for(int j=1;j<=B.len;j++)
{
C.a[i+j-1]+=A.a[i]*B.a[j];//相乘结果加在i+j-1上
C.a[i+j]+=C.a[i+j-1]/10;
C.a[i+j-1]%=10;
}
if(C.a[C.len+1])
C.len++;
C.clean();
return C;
}
};
Data A,B,C;
int main()
{
A.read();
B.read();
C = A+B;
//C=A-B;
//C=A*B;
C.write();
return 0;
}
重载运算符——高精度计算+-*
猜你喜欢
转载自www.cnblogs.com/wzy1744315462/p/12482948.html
今日推荐
周排行