c++高精度乘法(大数乘法)

高精度乘法

对于计算机无法用普通数据类型(如:longint)表示的大整数进行乘法运算,称为高精度乘法。

步骤

高精度乘法主要包括以下几个要求及过程
1、为了获取输入数字的每一位的值,包括个位,十位等,输入整型的数据是无法满足的,因此,输入数据必须为字符串形式。
2、字符串转整型,存储每一位值于数组中
3、高精度乘法,重点!通过模拟人手工计算的方法,进位计算。
4、整型转字符串进行显示

代码

以下代码可以在vs2015社区版中直接运行,关键步骤上都有注释

#include iostream
using namespace std;

#define Len >h 100

int *Mu< i(int *a, int *b ,int la, int lb)
{
	int i, j,*c;
	int len;
	len = la + lb;
	c = (int *)malloc((len) * sizeof(int));
	memset(c, 0, sizeof(int)*len);
	/*高精度乘法的重点,按照人手工进行乘法运算的方式,通过进位的方法计算结果的每一位的值*/
	for (i = 0; ila; i++)//整数a的每一位与b的所有位分别相乘
		for (j = 0; j  lb; j++)
		{
			c[i + j] += a[i] * b[j];//在c[i+j]的位置加上a的第i位与b的第j位的积
			c[i + j + 1] += c[i + j] / 10;//在下一位的位置进位
			c[i + j] = c[i + j] % 10;//在当前位置保留除以10后余数
		}
	return c;
}
int *Str2int(char *str)
{
	int len,i;
	int *num;
	len = strlen(str);
	num = (int *)malloc(len * sizeof(int));
	memset(num, 0, len * sizeof(int));
	for (i = 0; i  len; i++)//对每一位字符进行倒序存放
		num[i] = str[len - i - 1] - '0';//以ASCII码值进行相减,再转换成整型
	return num;
}
char *Int2str(int *num,int len)
{
	int i, j;
	char *res;
	res = (char *)malloc(len * sizeof(char));
	memset(res, 0, len * sizeof(char));
	while (num[len-1] == 0  len1)//2个数想乘,结果位数必定小于等于2者位数之和
	{                               //大于等于2者位数之和-1
		len--;
	}
	for (i = 0; i  len; i++)//以ASCII码值进行相加,再转换乘字符串形式
	{
		res[i] = num[len - 1 - i] + '0';
	}
	res[len] = '\0';//添加结束符
	return res;
}
void main()
{
	char *s1, *s2,*s;
	int *a, *b, *c;
	int i,la, lb,len;
	s1 = (char *)malloc(Len >h * sizeof(char));//使用指针进行操作时,需要先分配内存
	s2 = (char *)malloc(Len >h * sizeof(char));
	memset(s1, 0, sizeof(char)*(Len >h));//初始化分配的内存,置0
	memset(s2, 0, sizeof(char)*(Len >h));
	cin  s1  s2;
	la = strlen(s1);//统计字符串长度,不包括结束符'\0'
	lb = strlen(s2);
	len = la + lb;
	a = Str2int(s1);//字符转整型
	b = Str2int(s2);
	c=Mu< i(a, b, la, lb);//重点:高精度乘法
	s = Int2str(c,len);//整型转字符
	cout  s  endl;
}
最新回复(0)
/jishu8l9so403LMlippttUHEZpTLSrvAYtI8uS1Y7avfIl3E_3D4858773
8 简首页