高精度乘法
对于计算机无法用普通数据类型(如:longint)表示的大整数进行乘法运算,称为高精度乘法。
步骤
高精度乘法主要包括以下几个要求及过程
1、为了获取输入数字的每一位的值,包括个位,十位等,输入整型的数据是无法满足的,因此,输入数据必须为字符串形式。
2、字符串转整型,存储每一位值于数组中
3、高精度乘法,重点!通过模拟人手工计算的方法,进位计算。
4、整型转字符串进行显示
代码
以下代码可以在vs社区版中直接运行,关键步骤上都有注释
#include <iostream>using namespace std;#define Length 100int *Multi(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; i<la; 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 && len>1)//2个数想乘,结果位数必定小于等于2者位数之和{ //大于等于2者位数之和-1len--;}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(Length * sizeof(char));//使用指针进行操作时,需要先分配内存s2 = (char *)malloc(Length * sizeof(char));memset(s1, 0, sizeof(char)*(Length));//初始化分配的内存,置0memset(s2, 0, sizeof(char)*(Length));cin >> s1 >> s2;la = strlen(s1);//统计字符串长度,不包括结束符'\0'lb = strlen(s2);len = la + lb;a = Str2int(s1);//字符转整型b = Str2int(s2);c=Multi(a, b, la, lb);//重点:高精度乘法s = Int2str(c,len);//整型转字符cout << s << endl;}
如果觉得《c++高精度乘法(大数乘法)》对你有帮助,请点赞、收藏,并留下你的观点哦!