您的位置:首页 > 其它

大数加减法

2015-08-31 10:04 363 查看
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#define ll long long
#define esp 1e-10
using namespace std;

struct BigInteger
{
char num[10000];
BigInteger(){}
BigInteger(const char *s)
{
while(*s=='0')
s++;
if(*s==0)
s--;
strcpy(num,s);
}
BigInteger operator + (const BigInteger rr)const
{
char sum[10000];
int ptr=9998;
memset(sum,0,sizeof(sum));
int lenl=strlen(num);
int lenr=strlen(rr.num);
const char *l=num;
const char *r=rr.num;
int i,j;
for(i=lenl-1,j=lenr-1;i>=0&&j>=0;i--,j--)
{
int a=l[i]-'0';
int b=r[j]-'0';
int c=a+b+sum[ptr];
if(c<10)
sum[ptr--]=c+'0';
else
{
sum[ptr-1]++;
sum[ptr--]=(c-10)+'0';
}
}
const char *sec=lenl>lenr?l:r;
int cnt=lenl>lenr?i:j;
for(int k=cnt;k>=0;k--)
{
int a=sec[k]-'0';
int c=a+sum[ptr];
if(c<10)
sum[ptr--]=c+'0';
else
{
sum[ptr-1]++;
sum[ptr--]=(c-10)+'0';
}
}
sum[ptr]==1?(sum[ptr]+='0'):(ptr++);
return BigInteger(&sum[ptr]);
}
BigInteger operator - (const BigInteger rr)const
{
if(!strcmp(num,rr.num))
return BigInteger("0");
char sum[10000];
int ptr=9998;
memset(sum,0,sizeof(sum));
int lenl=strlen(num);
int lenr=strlen(rr.num);
const char *l=num;
const char *r=rr.num;
bool isNegative=false;
if(lenl<lenr||(lenl==lenr&&strcmp(num,rr.num)<0))
{
swap(lenl,lenr);
swap(l,r);
isNegative=true;
}
int i,j;
for(i=lenl-1,j=lenr-1;i>=0&&j>=0;i--,j--)
{
int a=l[i]-'0';
int b=r[j]-'0';
int c=a-b+sum[ptr];
if(c>=0)
sum[ptr--]=c+'0';
else
{
sum[ptr-1]--;
sum[ptr--]=(c+10)+'0';
}
}
const char *sec=l;
for(int k=i;k>=0;k--)
{
int a=sec[k]-'0';
int c=a+sum[ptr];
if(c>=0)
sum[ptr--]=c+'0';
else
{
sum[ptr-1]--;
sum[ptr--]=(c+10)+'0';
}
}
while(sum[++ptr]=='0');
//sum[ptr+1]=='0'?ptr+=2:(ptr++);
if(isNegative)
sum[--ptr]='-';
return BigInteger(&sum[ptr]);
}
};

char s1[1000],s2[1000];

int main()
{
//freopen("lalala.text","r",stdin)	;
while(~scanf("%s %s",s1,s2))
{
BigInteger a(s1);
BigInteger b(s2);
printf("%s\n",(a-b).num);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: