您的位置:首页 > 其它

51nod 1005 大数加法(可为负数)

2016-05-20 13:12 465 查看
给出2个大整数A,B,计算A+B的结果。

Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)


Output
输出A + B


没什么思路,就是转化为字符串之后模拟。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

int const maxn  = 100005;

char A[maxn],B[maxn];
int fa,fb;

void add(char* a,char* b)
{
int c[maxn];
int la = strlen(a)-1;
int lb = strlen(b)-1;
int cnt = 0 ;
int num = 0 ;
if(fa)
{
cout<<"-";
}
while(la>=fa&&lb>=fb)
{
c[num++] = (a[la] -'0'+ b[lb]-'0' + cnt)%10 ;
cnt = (a[la--] -'0'+ b[lb--]-'0' + cnt)/10;
}
while(la>=fa)
{
c[num++] = (a[la]-'0' + cnt)%10;
cnt = (a[la--]-'0'+cnt)/10;
}
while(lb>=fb)
{
c[num++] = (b[lb] -'0'+ cnt)%10;
cnt = (b[lb--]-'0'+cnt)/10;
}
if(cnt) c[num++]=cnt;

for(int i = num-1 ; i>=0 ; i--)cout<<c[i];
cout<<endl;
}

int cmp(char *a, char *b)
{
int la = strlen(a);
int lb = strlen(b);
if(la-fa>lb-fb)
return 1;
else if(la-fa<lb-fb)
return 0;
else
{
int i ;
for(i=0 ; i<la&&a[i+fa]==b[i+fb] ; ++i);
return a[i+fa]>b[i+fb];
}
}
void minu(char *a,char *b)
{
if(!cmp(a,b))
{    //保证a的绝对值大于b
if(fb)cout<<"-";
char *t;
t = a ; a = b ; b = t ;
int f;
f = fa ; fa = fb ; fb = f;

}
else if(fa)cout<<"-";
int la = strlen(a)-1;
int lb = strlen(b)-1;
int cnt = 0 ;
int num = 0 ;
int c[maxn];
while(la>=fa&&lb>=fb)
{
c[num++] = (a[la] - '0' - cnt - (b[lb] - '0') + 10 )%10;
cnt = (a[la--]-'0'-cnt < (b[lb--] - '0'));
}

while(la>=fa)
{
c[num++] = (a[la] - '0' - cnt  + 10 )%10;
cnt = (a[la--]-'0'-cnt <  0);
}
int i = num-1 ;
for(; i>=0 ; i--)if(c[i])break;
for( ;i>=0 ; i--)cout<<c[i];
cout<<endl;
}

int main()
{
cin>>A>>B;
fa = (A[0]=='-');
fb = (B[0]=='-');
if(fa!=fb)
{  //一正一负
minu(A,B);
}
else
{     //相加
add(A,B);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: