您的位置:首页 > 其它

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

2017-02-11 12:18 399 查看
题目:给出两个大整数A和B,A和B长度<=10000,可为负数,计算A+B的结果。

思路:1、分情况讨论,两个数符号一致,使用加法函数,若是负数则添负号。

           2、两个符号相异则使用减法函数,具体判断得出结果为正负添加负号。

           自己写的代码略复杂,看了别人的博文觉得很精简,推荐一篇:http://blog.csdn.net/qq1319479809/article/details/50358642,主要为两种方式java的大数模板和简约的C语言版本,还有一个用java写的,暂时没领悟。

           po上自己写的复杂版本,也算是可以做个模板用用吧。

#include "stdio.h"
#include "string.h"
#include <iostream>
using namespace std;
char A[10005], B[10005], C[10005];
int len1, len2, len3;
void Addab(int a[], int b[], int len)
{
int i, tmp;
memset(C, 0, sizeof(C));
for(i = 0; i < len; i++)
{
tmp = a[i] + b[i];
if(C[i] == '1')
tmp++;
len3 = i + 1;
if(tmp >= 10)
{
C[i + 1] = '1';
len3 = i + 2;
}
C[i] = tmp % 10 + '0';
}
}
void Subab(int a[], int b[], int len)
{
int i, j, tmp;
memset(C, 0, sizeof(C));
for(i = 0; i < len; i++)
{
if(a[i] >= b[i])
C[i] = a[i] - b[i] + '0';
else
{
tmp = 10 + a[i] - b[i];
C[i] = tmp + '0';
j = i + 1;
a[j]--;
while(a[j] < 0)
{
a[j] += 10;
j++;
a[j]--;
}
}
if(C[i] != '0')
len3 = i + 1;
}
}
int main()
{
int len, i;
int a[10005], b[10005];
while(~scanf("%s %s", A, B))
{
len1 = strlen(A);
len2 = strlen(B);
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
if(A[0] == '-' && B[0] != '-' || A[0] != '-' && B[0] == '-')
{
if(A[0] == '-')
{
i = 0;
while(--len1 >= 1)
a[i++] = A[len1] - '0';
len1 = i;
i = 0;
while(--len2 >= 0)
b[i++] = B[len2] - '0';
len2 = i;
if(len1 > len2)
{
Subab(a, b, len1);
C[len3++] = '-';
}
else if(len1 < len2)
Subab(b, a, len2);
else
{
i = len1 - 1;
while(i >= 0)
{
if(a[i] > b[i])
{
Subab(a, b, len1);
C[len3++] = '-';
break;
}
else if(a[i] < b[i])
{
Subab(b, a, len2);
break;
}
i--;
}
if(i < 0)
{
C[0] = '0';
len3 = 1;
}
}
}
else
{
i = 0;
while(--len1 >= 0)
a[i++] = A[len1] - '0';
len1 = i;
i = 0;
while(--len2 >= 1)
b[i++] = B[len2] - '0';
len2 = i;
if(len1 > len2)
Subab(a, b, len1);
else if(len1 < len2)
{
Subab(b, a, len2);
C[len3++] = '-';
}
else
{
i = len1 - 1;
while(i >= 0)
{
if(a[i] > b[i])
{
Subab(a, b, len1);
break;
}
else if(a[i] < b[i])
{
Subab(b, a, len2);
C[len3++] = '-';
break;
}
i--;
}
if(i < 0)
{
C[0] = '0';
len3 = 1;
}
}
}
}
else
{
if(len1 >= len2)
len = len1;
else
len = len2;
if(A[0] != '-' && B[0] != '-')
{
i = 0;
while(--len1 >= 0)
a[i++] = A[len1] - '0';
i = 0;
while(--len2 >= 0)
b[i++] = B[len2] - '0';
Addab(a, b, len);
}
else
{
i = 0;
while(--len1 >= 1)
a[i++] = A[len1] - '0';
i = 0;
while(--len2 >= 1)
b[i++] = B[len2] - '0';
Addab(a, b, len - 1);
C[len3++] = '-';
}
}
for(i = len3 - 1; i >= 0; i--)
printf("%c", C[i]);
printf("\n");
}
return 0;
}


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