算法学习-高精2-高精度乘法和除法(非高精作为除数)

高精度乘法和除法


前言

为什么要用高精?

因为C++不自带高精,进行大数的运算long long会爆掉

< 高精度乘法 >

一、实现思路

和高精度加法减法一样,都是先用string类输入,然后再倒叙输入给int型数组

string str1,str2;
cin>>str1>>str2;

int len1=str1.size();
int len2=str2.size();

for(i=1;i<=len1;++i) arr1[i]=str1[len1-i+1]-'0';
for(i=1;i<=len2;++i) arr2[i]=str2[len2-i+1]-'0';

然后逐位进行乘法,和加减不同,乘法要用两层循环,来模拟小学竖式乘法,而且通过规律可以知道,乘数 A 的第 i 位数与乘数 B 的第 j 位数相乘,其结果对应的是结果 C 的第 i+j-1 位数。

for(j=1;j<=len1;++j)
    for(i=1;i<=len2;++i)
    {
        c[i+j-1]+=arr1[j]*arr2[i];
        c[i+j]+=c[i+j-1]%10;
        c[i+j-1]=c[i+j-1]/10;
    }

最后就是输出了,容易知道,输出结果 C 的最大位数为 A 的位数 len1 加上 B 的位数 len2,当然还要删除前导0。

int len3=len1+len2;
while(c[len3]==0&&len3>1) --len3;

for(i=len3;i>=1;--i)
    cout<<c[i];

接下来是完整代码

二、代码实现

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str1,str2;
    int arr1[10050]={0},arr2[10050]={0},c[100000]={0};
    int i=0,j=0,len1=0,len2=0,len3=0;

    cin>>str1>>str2;

    len1=str1.size();
    len2=str2.size();

    for (i=1;i<=len1;++i)
        arr1[i]=str1[len1-i]-'0';
    for(i=1;i<=len2;++i)
        arr2[i]=str2[len2-i]-'0';

    for(i=1;i<=len1;++i)
        for(j=1;j<=len2;++j)
    {
        c[i+j-1]+=arr1[i]*arr2[j];
        c[i+j]+=c[i+j-1]/10;
        c[i+j-1]=c[i+j-1]%10;
    }
    len3=len1+len2;
    while(c[len3]==0&&len3>1) --len3;

    for(i=len3;i>=1;--i)
    cout<<c[i];

return 0;
}

还挺简单的。

<高精度减法>


一、<高精除以低精>


1、实现思路


输入部分不多赘述,直接上代码:

string str;
int d,arr[i];

cin>>str>>d;

len=str.size()

for(i=1;i<=len;++i) arr[i]=str[i-1]-'0';//除法就是从高位开始,故此处不许倒叙赋值

然后就是核心部分,其实也简单,由于商的最高位 小于等于 len,所以直接从len开始循环,然后就是喜闻乐见的竖式除法的进行:

for(i=1;i<=len;++i)
{
    c[i]=(arr[i]+x*10)/d;//x要提前定义并初始化为 0 .
    x=(arr[i]+x*10)%d;
}

最后删除前导0并输出商,余数也可以顺带一起输出了

i=1;
while(arr[i]==0&&i<len) ++i;

for(i;i<=len;++i)
    cout<<arr[i];

2、代码实现

也老简单了

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str;
    int c[10000]={0},arr[10000]={0},d=0,i=0,x=0;

    cin>>str>>d;

    int len=str.size();

    for (i=len;i>=1;--i) arr[i]=str[i-1]-'0';
    for (i=1;i<=len;++i)
    {
        c[i]=(x*10+arr[i])/d;
        x=(x*10+arr[i])%d;
    }

    for (i=1;c[i]==0&&i<len;++i);

    for (i;i<=len;++i)
        cout<<c[i];

    return 0;
}

二、<高精除以高精>

明天补上,快没时间了。

最后


不愉快

posted @ 2020-11-15 23:00  七铭的魔法师  阅读(157)  评论(0)    收藏  举报