高精度加法,减法,乘法,除法(下)(C语言)

前言
上一篇博客我们分享了高精度加法,减法,这一期我将为大家讲解高精度乘法和高精度除法。那让我们开始吧!
对加法和减法感兴趣的话就点我

在这里插入图片描述

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,尾声

这样我们的高精度算法就结束了,博主还将继续更新其他算法和编程学习的讲解。如果觉得感兴趣要记得关注下博主哦~。如果觉得本篇内容讲得不错的话请给博主一个赞和收藏吧。那么我们下期再见!

猜你喜欢

转载自blog.csdn.net/Tokai___Teio/article/details/134875862
今日推荐