zoukankan      html  css  js  c++  java
  • 高精度计算

    高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。例如,求两个20000位的数的和。这时,就要用到高精度算法了。

    1、高精度加法

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    struct node
    {
    int len,a[510];
    node()
    {
    len=0;
    memset(a,0,sizeof(a));
    }
    };
    int mymax(int x,int y)
    {
    return x>y?x:y;
    }
    node jiafa(node n1,node n2)
    {
    node n0;
    n0.len=mymax(n1.len,n2.len);
    for(int i=1;i<=n0.len;i++)
    {
    n0.a[i]=n1.a[i]+n2.a[i];
    }//先每个位相加
    for(int i=1;i<=n0.len;i++)
    {
    n0.a[i+1]+=n0.a[i]/10;
    n0.a[i]%=10;
    }//进位
    int i=n0.len;
    while(n0.a[i+1]>0)
    {
    i++;
    n0.a[i+1]+=n0.a[i]/10;
    n0.a[i]%=10;
    }
    while((n0.a[i]==0)&&(i>1))
    i--;
    n0.len=i;
    return n0;
    }//判断位数
    int main()
    {
    char st[511];
    node n0,n1,n2;
    scanf("%s",st+1);
    n1.len=strlen(st+1);
    for(int i=1;i<=n1.len;i++)
    n1.a[n1.len-i+1]=st[i]-'0';
    scanf("%s",st+1);
    n2.len=strlen(st+1);
    for(int i=1;i<=n2.len;i++)
    n2.a[n2.len-i+1]=st[i]-'0';
    n0=jiafa(n1,n2);
    for(int i=n0.len;i>=1;i--)
    printf("%d",n0.a[i]);
    cout<<endl;
    return 0;
    }

    2、高精度减法(两正数)

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    struct node
    {
    int len,a[510];
    node()
    {
    len=0;
    memset(a,0,sizeof(a));
    }
    };
    int mymax(int x,int y)
    {
    return x>y?x:y;
    }
    int bijiao(node n1,node n2)
    {
    if(n1.len>n2.len) return 1;
    if(n1.len<n2.len) return -1;
    for(int i=n1.len;i>=1;i--)
    {
    if(n1.a[i]>n2.a[i]) return 1;
    if(n1.a[i]<n2.a[i]) return -1;
    }
    return 0;
    }
    node jianfa(node n1,node n2)
    {
    node n0;
    n0.len=n1.len;
    for(int i=1;i<=n0.len;i++)
    n0.a[i]=n1.a[i]-n2.a[i];
    for(int i=1;i<=n0.len;i++)
    {
    if(n0.a[i]<0)
    {
    n0.a[i+1]--;
    n0.a[i]+=10;
    }
    }
    int i=n0.len;
    while(n0.a[i+1]>0)
    {
    i++;
    n0.a[i+1]=n0.a[i]/10;
    n0.a[i]%=10;
    }
    while((n0.a[i]==0)&&(i>1)) i--;
    n0.len=i;
    return n0;
    }
    int main()
    {
    char st[511];
    node n0,n1,n2;
    scanf("%s",st+1);
    n1.len=strlen(st+1);
    for(int i=1;i<=n1.len;i++)
    n1.a[n1.len-i+1]=st[i]-'0';
    scanf("%s",st+1);
    n2.len=strlen(st+1);
    for(int i=1;i<=n2.len;i++)
    n2.a[n2.len-i+1]=st[i]-'0';
    int tt=bijiao(n1,n2);//判断结果是否为负
    if(tt>=0) n0=jianfa(n1,n2);
    else n0=jianfa(n2,n1);//用较大的减
    if(tt<0)
    {
    cout<<"-";//为负则输出“-”
    for(int i=n0.len;i>=1;i--)
    printf("%d",n0.a[i]);
    }
    else
    {
    for(int i=n0.len;i>=1;i--)
    printf("%d",n0.a[i]);
    }

    }

    3、高精度乘法

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    struct node
    {
    int len,a[510];
    node()
    {
    len=0;
    memset(a,0,sizeof(a));
    }
    };
    node chengfa(node n1,node n2)
    {
    node n0;
    n0.len=n1.len+n2.len-1;
    for(int i=1;i<=n1.len;i++)
    {
    for(int j=1;j<=n2.len;j++)
    {
    n0.a[i+j-1]+=n1.a[j]*n2.a[j];
    }
    }//累乘
    for(int i=1;i<=n0.len;i++)
    {
    n0.a[i+1]+=n0.a[i]/10;
    n0.a[i]%=10;
    }//进位
    int i=n0.len;
    while(n0.a[i+1]>0)
    {
    i++;
    n0.a[i+1]=n0.a[i]/10;
    n0.a[i]%=10;
    }
    while((n0.a[i]==0)&&(i>1)) i--;
    n0.len=i;
    return n0;
    } //判断位数
    int main()
    {
    char st[511];
    node n0,n1,n2;
    scanf("%s",st+1);
    n1.len=strlen(st+1);
    for(int i=1;i<=n1.len;i++)
    n1.a[n1.len-i+1]=st[i]-'0';
    scanf("%s",st+1);
    n2.len=strlen(st+1);
    for(int i=1;i<=n2.len;i++)
    n2.a[n2.len-i+1]=st[i]-'0';
    n0=chengfa(n1,n2);
    for(int i=n0.len;i>=1;i--) cout<<n0.a[i];
    cout<<endl;
    return 0;
    }

  • 相关阅读:
    .NET Web应用配置本地IIS(实现Visual Studio离线运行与调试)
    Windows10 IIS Web服务器安装配置
    Visual Studio 2022 Preview设置简体中文
    nlp中各中文预训练模型的输入和输出
    numpy和Pytorch对应的数据类型
    Zookeeper入门看这篇就够了
    做一个有温度的程序员
    Apollo 配置中心详细教程
    浅析 DDD 领域驱动设计
    把之前CompletableFuture留下的坑给填上。
  • 原文地址:https://www.cnblogs.com/zhaoxuelin/p/12457951.html
Copyright © 2011-2022 走看看