ltx_zero

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

高精度专题

高精度加减乘

  • 需要注意区分len和c.len
  • temp要注意及时恢复成零,尤其是外圈循环
  • 内层temp修改的时候避免影响到本轮
  • 注意出现多余的0的判断是c.d[c.len-1]balabala,使用c.d[c.len]不可哦,范围是0-c.len01
  • 并且删除掉多余的0的时候要至少保留一位,所以c.len>=2是边界条件
  • 减法修改顺序,cmp自己写,遇到了添加减号。
  • 高精度加法暂时只适用于非负数

高精度减法

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct bign
{
    int d[11000];
    int len;//len是长度,存0~len-1
    bign()
    {
        memset(d,0,sizeof(d));
        len=0;
    }
};
bool cmp(bign a,bign b)
{
    if(a.len!=b.len)
    {
        return a.len>b.len;
    }
    int len=a.len;
    for(int i=len-1;i>=0;i--)
    {
        if(a.d[i]!=b.d[i])
            return a.d[i]>b.d[i];
    }
    return true;
}
bign add(bign a,bign b)
{
    bign c;
    int temp=0;
    int len=max(a.len,b.len);
    for(int i=0;i<=len-1;i++)
    {
        c.d[c.len++]=(a.d[i]+b.d[i]+temp)%10;
        temp=(a.d[i]+b.d[i]+temp)/10;
    }
    if(temp)
    {
        c.d[c.len++]=1;
    }
    return c;
}
bign sub(bign a,bign b)//规定a-b大于等于0了
{
    if(cmp(a,b)==false)
    {
        bign temp=a;
        a=b;
        b=temp;
    }//强制大减小
    int temp=0;
    bign c;
    int len=max(a.len,b.len);
    for(int i=0;i<=len-1;i++)
    {
        c.d[i]=a.d[i]-b.d[i]+temp;
        temp=0;
        if(c.d[i]<0)
        {
            c.d[i]=c.d[i]+10;
            temp=-1;
        }
    }
    c.len=len;
    while(c.d[c.len-1]==0 && c.len>=2) c.len--;
    return c;
}
bign multi(bign a,bign b)
{
    int temp=0;
    bign c;
    for(int i=0;i<=a.len-1;i++)
    {
        for(int j=0;j<=b.len-1;j++)
        {
            c.d[i+j]=c.d[i+j]+a.d[i]*b.d[j]+temp;
            temp=c.d[i+j]/10;
            c.d[i+j]=c.d[i+j]%10;
        }
        c.d[i+b.len]=c.d[i+b.len]+temp;
        temp=0;//一定要写
    }
    c.len=a.len+b.len;
    while(c.d[c.len-1]==0 && c.len>=2) c.len--;
    return c;
}
bign change(char str[])
{
    bign c;
    int len=strlen(str);
    for(int i=len-1;i>=0;i--)
        c.d[len-1-i]=str[i]-'0';
    c.len=len;
    return c;
}
void print(bign a)
{
    for(int i=a.len-1;i>=0;i--)
        printf("%d",a.d[i]);
    printf("\n");
    return ;
}
int main()
{
    bign a;
    bign b;
    char str1[11000];
    char str2[11000];
    scanf("%s",str1);
    scanf("%s",str2);
    a=change(str1);
    b=change(str2);
   // bign ans=add(a,b);
    bign ans1=sub(a,b);
    //bign ans2=multi(a,b);
    //print(a);
    //print(b);
   // print(ans);
   if(!cmp(a,b)) printf("-");
    print(ans1);
    //print(ans2);
    return 0;
}
View Code

 高精度加法

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct bign
{
    int d[1000];
    int len;//len是长度,存0~len-1
    bign()
    {
        memset(d,0,sizeof(d));
        len=0;
    }
};
bool cmp(bign a,bign b)
{
    if(a.len!=b.len)
    {
        return a.len>b.len;
    }
    int len=a.len;
    for(int i=len-1;i>=0;i--)
    {
        if(a.d[i]!=b.d[i])
            return a.d[i]>b.d[i];
    }
    return true;
}
bign add(bign a,bign b)
{
    bign c;
    int temp=0;
    int len=max(a.len,b.len);
    for(int i=0;i<=len-1;i++)
    {
        c.d[c.len++]=(a.d[i]+b.d[i]+temp)%10;
        temp=(a.d[i]+b.d[i]+temp)/10;
    }
    if(temp)
    {
        c.d[c.len++]=1;
    }
    return c;
}
bign sub(bign a,bign b)//规定a-b大于等于0了
{
    if(cmp(a,b)==false)
    {
        bign temp=a;
        a=b;
        b=temp;
    }//强制大减小
    int temp=0;
    bign c;
    int len=max(a.len,b.len);
    for(int i=0;i<=len-1;i++)
    {
        c.d[i]=a.d[i]-b.d[i]+temp;
        temp=0;
        if(c.d[i]<0)
        {
            c.d[i]=c.d[i]+10;
            temp=-1;
        }
    }
    c.len=len;
    while(c.d[c.len-1]==0 && c.len>=2) c.len--;
    return c;
}
bign multi(bign a,bign b)
{
    int temp=0;
    bign c;
    for(int i=0;i<=a.len-1;i++)
    {
        for(int j=0;j<=b.len-1;j++)
        {
            c.d[i+j]=c.d[i+j]+a.d[i]*b.d[j]+temp;
            temp=c.d[i+j]/10;
            c.d[i+j]=c.d[i+j]%10;
        }
        c.d[i+b.len]=c.d[i+b.len]+temp;
        temp=0;//一定要写
    }
    c.len=a.len+b.len;
    while(c.d[c.len-1]==0 && c.len>=2) c.len--;
    return c;
}
bign change(char str[])
{
    bign c;
    int len=strlen(str);
    for(int i=len-1;i>=0;i--)
        c.d[len-1-i]=str[i]-'0';
    c.len=len;
    return c;
}
void print(bign a)
{
    for(int i=a.len-1;i>=0;i--)
        printf("%d",a.d[i]);
    printf("\n");
    return ;
}
int main()
{
    bign a;
    bign b;
    char str1[1000];
    char str2[1000];
    scanf("%s",str1);
    scanf("%s",str2);
    a=change(str1);
    b=change(str2);
    bign ans=add(a,b);
    //bign ans1=sub(a,b);
    //bign ans2=multi(a,b);
    //print(a);
    //print(b);
    print(ans);
    //print(ans1);
    //print(ans2);
    return 0;
}
View Code

写了高精度加减乘,暂时不会高精度除高精度,回头补。加减已验证,乘暂时没验证

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct bign
{
    int d[1000];
    int len;//len是长度,存0~len-1
    bign()
    {
        memset(d,0,sizeof(d));
        len=0;
    }
};
bool cmp(bign a,bign b)
{
    if(a.len!=b.len)
    {
        return a.len>b.len;
    }
    int len=a.len;
    for(int i=len-1;i>=0;i--)
    {
        if(a.d[i]!=b.d[i])
            return a.d[i]>b.d[i];
    }
    return true;
}
bign add(bign a,bign b)
{
    bign c;
    int temp=0;
    int len=max(a.len,b.len);
    for(int i=0;i<=len-1;i++)
    {
        c.d[c.len++]=(a.d[i]+b.d[i]+temp)%10;
        temp=(a.d[i]+b.d[i]+temp)/10;
    }
    if(temp)
    {
        c.d[c.len++]=1;
    }
    return c;
}
bign sub(bign a,bign b)//规定a-b大于等于0了
{
    if(cmp(a,b)==false)
    {
        bign temp=a;
        a=b;
        b=temp;
    }//强制大减小
    int temp=0;
    bign c;
    int len=max(a.len,b.len);
    for(int i=0;i<=len-1;i++)
    {
        c.d[i]=a.d[i]-b.d[i]+temp;
        temp=0;
        if(c.d[i]<0)
        {
            c.d[i]=c.d[i]+10;
            temp=-1;
        }
    }
    c.len=len;
    while(c.d[c.len-1]==0 && c.len>=2) c.len--;
    return c;
}
bign multi(bign a,bign b)
{
    int temp=0;
    bign c;
    for(int i=0;i<=a.len-1;i++)
    {
        for(int j=0;j<=b.len-1;j++)
        {
            c.d[i+j]=c.d[i+j]+a.d[i]*b.d[j]+temp;
            temp=c.d[i+j]/10;
            c.d[i+j]=c.d[i+j]%10;
        }
        c.d[i+b.len]=c.d[i+b.len]+temp;
        temp=0;//一定要写
    }
    c.len=a.len+b.len;
    while(c.d[c.len-1]==0 && c.len>=2) c.len--;
    return c;
}
bign change(char str[])
{
    bign c;
    int len=strlen(str);
    for(int i=len-1;i>=0;i--)
        c.d[len-1-i]=str[i]-'0';
    c.len=len;
    return c;
}
void print(bign a)
{
    for(int i=a.len-1;i>=0;i--)
        printf("%d",a.d[i]);
    printf("\n");
    return ;
}
int main()
{
    bign a;
    bign b;
    char str1[1000];
    char str2[1000];
    scanf("%s",str1);
    scanf("%s",str2);
    a=change(str1);
    b=change(str2);
    bign ans=add(a,b);
    //bign ans1=sub(a,b);
    //bign ans2=multi(a,b);
    //print(a);
    //print(b);
    print(ans);
    //print(ans1);
    //print(ans2);
    return 0;
}
View Code

 

posted on 2020-02-08 19:00  ltx_zero  阅读(157)  评论(0编辑  收藏  举报