失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > c++高精度乘法(大数乘法)

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

时间:2021-07-25 04:22:32

相关推荐

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

高精度乘法

对于计算机无法用普通数据类型(如: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++高精度乘法(大数乘法)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。