大整数的运算

大整数题

整体套路还是字符串模拟

加法

首先判断大数的符号:

  1. 同号相加,异号相减
//判断符号
	fa = ('-' == A[0]);
	fb = ('-' == B[0]);

	//异号为减,同号为加
	if (fa ^ fb)
		minus(A, B);
	else
		add(A, B);
  1. 处理同号
    对同号的处理就是模拟相加
    模拟就要考虑到加法运算的问题,顺序我们是没法进行正常的逻辑加运算的,
    所以要处理下字符串位置问题进行一个逆序的操作
//翻转字符串
	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]);
  1. 下面考虑符号相异问题,相异就要考虑两个大数的大小判断,在大小判断基础上再在进行减法的模拟
    首先处理这两个大数的绝对值大小问题
//判断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]);
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值