高精度乘法

今天算是假期集训的第一天,第一次一整天只学信息,刺激啊~~~虽然很累,但是还是要整理一下嘛。

                                                       高精度

之前学过高精度加法,所以不多说,直接出代码:

#include<iostream>
#include<cstring>
using namespace std;
int main(){
    char a[205],b[205];
    int a1[205],m,c[205],b1[205],l2,l1,l,k=1;
    scanf("%s",a);
    scanf("%s",b);
    l1=strlen(a);
    l2=strlen(b);
    memset(c,0,sizeof(c));
    memset(a1,0,sizeof(a1));
    memset(b1,0,sizeof(b1));
    for(int i=0;i<l1;i++)
    {
        a1[l1-i-1]=a[i]-48;
    }
    for(int i=0;i<l2;i++)
    {
        b1[l2-i-1]=b[i]-48;
    }
    m=0;
    for(int i=0;i<max(l1,l2)+1;i++)
    {
        c[i]=a1[i]+b1[i]+m;
        m=c[i]/10;
        c[i]=c[i]%10;
    }
    l=max(l1,l2);
    for(int i=l;i>=0;i--)
    if(c[i]==0)l--;
    else
    break;
    for(int i=l;i>=0;i--)
    {
        cout<<c[i];
        k=0;
    }
    if(k==1)
    cout<<"0";
    return 0;
}

今天新学了一个高精乘法,总体思路是一样的,无非分为3个模块,分别是:读入数字,进行运算,输出得数。

第一点,读入数字。和加法一样,读入一个字符串,再一一倒着转换为整形数组。(倒着存一是为了对齐末尾,二是为了方便)

第二点,进行运算。核心代码段:


    for(int i = 1;i <= l1;i++)
    {
        x = 0;
        for(int j = 1;j <= l2;j++)
        {
            c[i + j - 1] = x + c[i + j - 1] + a[i] * b[j];
            x = c[i + j - 1] / 10;
            c[i + j - 1] %= 10;
        }
        c[i + l1] = x;
    }

这个是整个代码的核心,主要难点是进位,进位解决了,整个程序就没什么难度了。(不要忘了  c[i + l1] = x; 进行最后一位的进位)

最后输出得数,除了删除前导零,没什么难度。

代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char a1[100],b1[100];
int a[100] = {0},b[100] = {0},c[205] = {0};
int main()
{
    int l1,l2,l,x;
    gets(a1);
    gets(b1);
    l1 = strlen(a1);
    l2 = strlen(b1);
    for(int i = 0;i < l1; i++)
    {
        a[l1 - i] = a1[i] - '0';
    }
    for(int i = 0;i < l2; i++)
    {
        b[l2 - i] = b1[i] - '0';
    }
    for(int i = 1;i <= l1;i++)
    {
        x = 0;
        for(int j = 1;j <= l2;j++)
        {
            c[i + j - 1] = x + c[i + j - 1] + a[i] * b[j];
            x = c[i + j - 1] / 10;
            c[i + j - 1] %= 10;
        }
        c[i + l1] = x;
    } 
    l = l1 + l2;
    for(int i = l;i > 1; i--)
    {
        if(c[i] != 0)
        break;
        else
        l--;
    }
    for(int i = l;i >= 1;i--)
    {
        cout<<c[i];
    }
    return 0;
}
只想找一个不会伤害我的人
原文地址:https://www.cnblogs.com/DukeLv/p/8321873.html