一、高精度数的输入输出

    char ci[maxn],cj[maxn];
    scanf("%s",ci+1);
    scanf("%s",cj+1);
    int len1=strlen(ci+1);
    int len2=strlen(cj+1);
    a.w[0]=len1;
    for (int i=1;i<=len1;i++)
      a.w[i]=ci[len1-i+1]-'0';//反着记录 
    b.w[0]=len2;
    for (int i=1;i<=len2;i++)
      b.w[i]=cj[len2-i+1]-'0';

二、高精度+高精度

hp jia(hp a,hp b)
{
    hp c;
    if (a.w[0]>b.w[0]) c.w[0]=a.w[0]+1;
    else c.w[0]=b.w[0]+1;
    for (int i=1;i<=c.w[0];i++) c.w[i]=0;
    for (int i=1;i<c.w[0];i++)//< not <=
    {
        c.w[i]+=a.w[i]+b.w[i];//+=
        c.w[i+1]+=c.w[i]/10;//+=
        c.w[i]=c.w[i]%10;
    }
    while (c.w[0]!=0&&c.w[c.w[0]]==0) c.w[0]--;
    return c;
}

三、高精度-高精度

1、判断正负

bool bj(hp a,hp b)
{
    if (a.w[0]<b.w[0]) return false;
    for (int i=1;i<=a.w[0];i++)
      if (b.w[0]>a.w[0]) return false;
    return true;
}
if (bj(a,b)) x=jian(a,b);
    else {
        cout<<"-";
        x=jian(b,a);
    }

2、减法

hp jian(hp a,hp b)
{
    hp c;
    c.w[0]=a.w[0];
    for(int i=1;i<=c.w[0];i++) c.w[i]=0;
    for (int i=1;i<=c.w[0];i++)
    {
        if (a.w[i]<b.w[i]){
            a.w[i]+=10;
            a.w[i+1]--;
        }
        c.w[i]=a.w[i]-b.w[i];
    }
    while (c.w[0]>0&&c.w[c.w[0]]==0) c.w[0]--;
    return c;
}

三、高精度*高精度

hp cheng(hp a,hp b)
{
    hp c;
    c.w[0]=a.w[0]+b.w[0];
    for (int i=1;i<=c.w[0];i++) c.w[i]=0;
    for (int i=1;i<=a.w[0];i++)
     for (int j=1;j<=b.w[0];j++)
     {
         c.w[i+j-1]+=a.w[i]*b.w[j];
         c.w[i+j]+=c.w[i+j-1]/10;
         c.w[i+j-1]=c.w[i+j-1]%10;
     }
    while (c.w[0]>=1&&c.w[c.w[0]]==0) c.w[0]--;
    return c;
}

四、高精度/高精度

1、按位相减 之 numcpy:用456/12,在第一位4的时候/120

void numcpy(hp &t,int id)
{
    for (int i=1;i<=b.w[0];i++)
      t.w[i+id-1]=b.w[i];
    t.w[0]=b.w[0]+id-1;
}

2、按位相减:相应位数商+1

hp chu(hp a,hp b)
{
    hp c;
    c.w[0]=a.w[0]-b.w[0]+1;
    for (int i=1;i<=c.w[0];i++) c.w[i]=0;
    for (int i=c.w[0];i>=1;i--)
    {
        hp tmp;
        tmp.w[0]=b.w[0]+i-1;
        for (int j=1;j<=tmp.w[0];j++) tmp.w[j]=0;
        numcpy(tmp,i);
        while (bj(a,tmp)) {
            c.w[i]++;jian(a,tmp);
        }
    }
    while (c.w[0]>=1&&c.w[c.w[0]]==0) c.w[0]--;
    return c;
}

3、减法的过程(与高精减高精不同,要修改a)

bool bj(hp a,hp b)
{
    if (a.w[0]<b.w[0]) return false;
    else if (a.w[0]>b.w[0]) return true;
    int cnt=0;
    for (int i=a.w[0];i>=1;i--)//顺序 
      {
          if (a.w[i]>b.w[i]) return true;
          if (a.w[i]<b.w[i]) return false;
      }
    return true;
}
void jian(hp & a,hp b)
{
    for (int i=1;i<=b.w[0];i++)//b.w[0]
    {
        if(a.w[i]<b.w[i]) 
        {
            a.w[i+1]--;//a.w[i]-- not b
            a.w[i]+=10;
        }    
        a.w[i]-=b.w[i];
    }
    while (a.w[0]>=1&&a.w[a.w[0]]==0) a.w[0]--;//修改a 
}

 

 posted on 2016-11-18 07:40  qzgxlx  阅读(162)  评论(0编辑  收藏  举报