分治法求解大整数相乘问题

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define sign(x) ((x>0)?1:-1)

//_int64等同于long long 
//%I64d等同于%lld

_int64 mutipy(_int64 a, _int64 b, int num) {  //两个long long 类型的大整数相乘,后面会用字符串做法解决
	int s = sign(a) * sign(b);
	a = (a > 0) ? a : -a;
	b = (b > 0) ? b : -b;
	if (num == 0)  //递归出口,
		return 0;
	else if (num == 1) {  //当a,b只有一位数时,直接相乘
		return s * a * b;
	}
	else {

		_int64 A = a / (int)pow(10, (int)(num / 2));  //分离大整数a的高位
		_int64 B = a % (int)pow(10, (int)(num / 2)); //分离大整数a的低位
		_int64 C = b / (int)pow(10, (int)(num / 2));   //分离大整数b的高位
		_int64 D = b % (int)pow(10, (int)(num / 2));     //分离大整数b的低位

		_int64 AC = mutipy(A, C, (int)(num / 2));  //分治计算AC
		_int64 BD = mutipy(B, D, (int)(num / 2));  //分治计算BD
		_int64 ABCD = mutipy((A - B), (D - C), (int)(num / 2)) + AC + BD;  //计算(A-B)(D-C)+AC+BD
		return s * (_int64)(AC * pow(10, (int)(num / 2) + (int)(num / 2)) + ABCD * pow(10, (int)(num / 2)) + BD);  //返回结果
	}
}
int main()
{
	_int64 a, b, c, temp;  //long long a,b,c;
	int len1 = 0, len2 = 0;

	while (scanf("%I64d %I64d", &a, &b)) {
		temp = a;
		while (temp) {  //计算a的位数
			len1++;
			temp = temp / 10;
		}
		c = mutipy(a, b, len1);
		printf("%I64d\n", c);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值