UVa 10106 - Product 高精度乘法-

高精度乘法,主要思想是把第一个因子的个位都与第二个因子每个位相乘后存储对应的i+j的p数组中,接着继续第一个因子的十位,并累加到对应的p【i+j】中,依次进行到最高位。最后再对每个p应用高精度加法的思想,累加取进位和余位。

需要注意的是:积的长度是因子的长度和或者长度和-1

//10106 - Product
//高精度乘法
#include <iostream>
#include <cstring>
using namespace std;

char product[600], a[300], b[300];
int P[600], A[300], B[300];
int transfort(char *, int *);//把字符数组反转后,转化为int数组
void reverse(int);//按len的长度反转int数组并转换为字符数组

int main()
{
	//freopen("data.txt", "r", stdin);
	while (scanf("%s%s", a, b) == 2)
	{
		if(a[0] == '0' || b[0] == '0')//处理输入为0的情况
		{
			printf("0\n");
			continue;
		}
			
		int len_a = transfort(a, A);
		int len_b = transfort(b, B);
		int len_P = len_a + len_b;
		for(int i = 0; i < len_a; i++)
			for(int j = 0; j < len_b; j++)
				P[i + j] += A[i] * B[j];//每一对应位的积累加
		
		for(int i = 0; i < len_P - 1; i++)
		{
			P[i + 1] += P[i] / 10;//进位的值
			P[i] %= 10;//余位
		}
		if(P[len_P - 1] == 0)//判断最高位的值
			len_P--;//积的长度为两个因子的长度和或者长度和-1
		reverse(len_P);
		printf("%s\n", product);

		memset(product, 0, sizeof(product));
		memset(P, 0, sizeof(P));
		memset(A, 0, sizeof(A));
		memset(B, 0, sizeof(B));
		memset(a, 0, sizeof(a));
		memset(b, 0, sizeof(b));
	}
	return 0;
}


void reverse(int n)
{

	for(int j = 0; j < n; j++)
		product[j] = P[j] + '0';
	char c;
	for(int i = 0; i < n / 2; i++)
	{
		c = product[i];
		product[i] = product[n - i - 1];
		product[n - i - 1] = c;
	}

}

int transfort(char * s, int *A)
{
	int len = strlen(s);
	for(int i = 0; i < len; i++)
		A[i] = s[len - i - 1] - '0';
	return len;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值