大整数题
整体套路还是字符串模拟
加法
首先判断大数的符号:
- 同号相加,异号相减
//判断符号
fa = ('-' == A[0]);
fb = ('-' == B[0]);
//异号为减,同号为加
if (fa ^ fb)
minus(A, B);
else
add(A, B);
- 处理同号
对同号的处理就是模拟相加
模拟就要考虑到加法运算的问题,顺序我们是没法进行正常的逻辑加运算的,
所以要处理下字符串位置问题进行一个逆序的操作
//翻转字符串
for (i = fa, j = la - 1; i <= j; ++i, --j) swap(a, i, j);
for (i = fb, j = lb - 1; i <= j; ++i, --j) swap(b, i, j);
开始模拟相加,同时要考虑到相加值溢出的问题
//模拟加法
for (i = fa; i < la || i < lb; ++i)
{
s = a[i] + b[i] + c;
c = s / 10;
a[i] = s % 10;
}
a[i] = c;
l = c ? i : i - 1;
最后逆序输出,不要忘了符号
//在逆序输出
if (fa) printf("-");
for (i = l; i >= fa; --i) printf("%d", a[i]);
- 下面考虑符号相异问题,相异就要考虑两个大数的大小判断,在大小判断基础上再在进行减法的模拟
首先处理这两个大数的绝对值大小问题
//判断ab的绝对值大小
int cmp(char* a, char* b)
{
int i, j, la, lb;
la = strlen(a);
lb = strlen(b);
if (la - fa > lb - fb)
return 1;
else if (la - fa < lb - fb)
return 0;
else
{
for (i = 0; i < la && a[i + fa] == b[i + fb]; ++i);
return a[i + fa] > b[i + fb];
}
}
同样先进行逆序操作
for (i = fa, j = la - 1; i <= j; ++i, --j) swap(a, i, j);
for (i = fb, j = lb - 1; i <= j; ++i, --j) swap(b, i, j);
模拟减法
//模拟减法
c = 0;
l = -1;
for (i = 0; i + fa < la; ++i)
{
s = a[i + fa] - b[i + fb] - c >= 0 ? 0 : 1;
a[i + fa] = (10 + a[i + fa] - b[i + fb] - c) % 10;
l = a[i + fa] ? i + fa : l;
c = s;
}
逆序输出,先判断是否为0的问题
if (l < 0)
printf("0");
else
{
if (fa) printf("-");
for (i = l; i >= fa; --i) printf("%d", a[i]);
}