前言
上一篇博客我们分享了高精度加法,减法,这一期我将为大家讲解高精度乘法和高精度除法。那让我们开始吧!
对加法和减法感兴趣的话就点我
文章目录
- 1,乘法
- 2,除法
- 3,尾声
1,乘法
让我们想想我们平时做数学时遇见乘法是怎么做的。以下图为例。
高精度乘法也是这样的一个思路,首先我们先把a和b的值储存进两个数组之中。然后将两个数组翻转之后,让a乘以b的每一位(从个位开始),然后错位相加。最后即可得到结果。
下面我用代码的方式来讲解:
#include <stdio.h>
#include<string.h>
void my_reverse(char* arr, int len)//翻转函数
{
for (int i = 0; i < len - 1; i++, len--)
{
char temp = arr[i];
arr[i] = arr[len - 1];
arr[len - 1] = temp;
}
}
void print_mul(int len1, int len2, char* arr1, char* arr2,int* mul)
{
for (int i = 0; i < len2; i++)
{
for (int j = 0; j < len1; j++)//让arr1的每一位都乘以arr2的第i位
{//高精度加法
mul[i + j] += (arr1[j]-'0') * (arr2[i]-'0');//将结果存放在mul中
mul[i + j + 1] += mul[i + j] / 10;
mul[i + j] %= 10;
}
}
while (mul[len1 + len2] == 0&&len1+len2 > 0)//去除前缀多余的0
len1--;
for (int i = len1 + len2; i >= 0; i--)//打印结果
printf("%d", mul[i]);
}
int main()
{
char arra[10100] = { 0 }, arrb[10100] = { 0 }; int arrmul[10010] = { 0 };//分别储存a,b的值和a*b的值
scanf("%s %s", arra, arrb);
int lena = strlen(arra);//计算a和b的长度
int lenb = strlen(arrb);
my_reverse(arra, lena);//将a和b进行翻转方便进行运算
my_reverse(arrb, lenb);
print_mul(lena, lenb, arra, arrb, arrmul);
return 0;
}
我们学习之后可以去洛谷进行测试(洛谷 P1303 A*B Problem)
2,除法
除法在这里,点我点我!
3,尾声
这样我们的高精度算法就结束了,博主还将继续更新其他算法和编程学习的讲解。如果觉得感兴趣要记得关注下博主哦~。如果觉得本篇内容讲得不错的话请给博主一个赞和收藏吧。那么我们下期再见!