2017.7.14. 高精度四则运算

来源:互联网 发布:json 20160212.jar 编辑:程序博客网 时间:2024/06/06 01:58

高精度加法

适用题型:涉及到加数 > long long的加法运算

std.cpp

#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstdlib>#include<string>#include<cstring>#include<ctime>using namespace std;int a[205],b[205],c[205],n,m;int i,j,k,x;char s[205];int main(){    //freopen("jiafa.in","r",stdin);    //freopen("jiafa.out","w",stdout);    memset(a,0,sizeof(a));    memset(b,0,sizeof(b));    memset(c,0,sizeof(c));    scanf("%s",s);    n=strlen(s);    for(i=0;i<n;i++)       a[n-i]=s[i]-'0';    scanf("%s",s);    m=strlen(s);    for(i=0;i<m;i++)       b[n-i]=s[i]-'0';    if(n<m)       n=m;    x=0;    for(i=1;i<=n;i++)       {          x=a[i]+b[i]+x;          c[i]=x%10;          x=x/10;       }       if(x>0)       {        n++;        c[n]=x;//...不能打成 c[n++]=x......       }       for(i=n;i>=1;i--)          printf("%d",c[i]);    return 0;}

高精度减法

适用题型:涉及到被减数,减数 > long long的减法运算

std.cpp

#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstdlib>#include<string>#include<cstring>#include<ctime>using namespace std;int a[300],b[300],c[300],m,n;char s[300],t[300];int i,j,k,x,y;int main(){    //freopen("jianfa.in","r",stdin);    //freopen("jianfa.out","w",stdout);    memset(a,0,sizeof(a));    memset(b,0,sizeof(b));    memset(c,0,sizeof(c));    scanf("%s",s);    m=strlen(s);    for(i=0;i<m;i++) a[m-i]=s[i]-'0';    scanf("%s",t);    n=strlen(t);    for(i=0;i<n;i++) b[n-i]=t[i]-'0';    if(m<n||n==m&&strcmp(s,t)<0)      {        printf("-");        for(i=1;i<=n;i++)         swap(a[i],b[i]);        swap(m,n);      }    for(i=1;i<=m;i++)     {       x=a[i]-b[i]+10;       c[i]=x%10;       a[i+1]=a[i+1]-1+x/10;     }    while(m>1&&c[m]==0)         m--;    for(i=m;i>=1;i--)        printf("%d",c[i]);    return 0;}

高精度乘法

适用题型:涉及到乘数 > long long的乘法运算

std.cpp

#include<iostream>#include<cstdio>#include<iomanip>#include<cstdlib>#include<algorithm>#include<cmath>#include<cstring>#include<string>using namespace std;int a[300],b[300],c[600],n,m,k,x;char s[300];int main(){    memset(a,0,sizeof(a));    memset(b,0,sizeof(b));    memset(c,0,sizeof(c));    scanf("%s",s);    n = strlen(s);    for(int i=0;i<n;i++)        a[n-i]=s[i]-'0';    scanf("%s",s);    m = strlen(s);    for(int i=0;i<m;i++)        b[m-i]=s[i]-'0';    for(int i=1;i<=n;i++)    {        x=0;        for(int j=1;j<=m;j++)        {            x+=a[i]*b[j]+c[i+j-1];            c[i+j-1]=x%10;            x/=10;        }        c[i+m]+=x;    }    int len = n+m;    while(len>1&&c[len]==0) len--;    for(int i=len;i>0;i--)        cout << c[i];        return 0;}

高精度除法(高÷int)

适用题型:涉及到被除数 > long long,除数 < int的除法运算

std.cpp

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cmath>#include<ctime>#include<cstdlib>#include<algorithm>using namespace std;int main(){  //freopen("in.txt","r",stdin);  //freopen("out.txt","w",stdout);  int a[300],b[300],i,j,n,m,x;  char s[300];  memset(a,0,sizeof(a));  memset(b,0,sizeof(b));  cin>>s;     n=strlen(s);     for(i=0;i<n;i++) a[i]=s[i]-'0';    cin>>m;  x=0;  for (i=0;i<n;i++)       {     b[i]=(x*10+a[i])/m;     x=(x*10+a[i]) % m;   }  j=1;  while ((b[j]==0) && (j<n-1))   j++;      for (i=j;i<n;i++)   cout<<b[i];    printf("\n");  printf("%d\n",x);  return 0;}

高精度除法(高÷高)

适用题型:涉及到被除数,除数 > long long 的除法运算

std.cpp

#include<iostream>#include<ctime>#include<algorithm>#include<cstring>#include<string>#include<cstdio>#include<cmath>#include<cstdlib>#include<iomanip>using namespace std;int a[210],b[210],c[210],t[210],d;inline void cpy(int p[],int q[],int det){    for(int i=1;i<=p[0];++i)        q[i+det-1]=p[i];    q[0]=p[0]+det-1;}inline int cmp(int a[],int b[]){    if(a[0]>b[0])        return 1;    if(a[0]<b[0])        return -1;    for(int i=a[0];i>0;--i)    {        if(a[i]>b[i])            return 1;        if(a[i]<b[i])            return -1;    }    return 0;}inline void jian(int a[],int b[]){    int fl=cmp(a,b);    if(fl==0)        {            a[0]=0;            return;        }    if(fl==1)        {            for(int i=1;i<=a[0];++i)                {                    if(a[i]<b[i])                        --a[i+1],a[i]+=10;                    a[i]-=b[i];                }            while(a[0]>0&&a[a[0]]==0)                --a[0];            return;        }}int main(){    string s;    cin>>s;    a[0]=s.length();    for(int i=1;i<=a[0];++i)        a[i]=s[a[0]-i]-'0';    cin>>s;    b[0]=s.length();    for(int i=1;i<=b[0];++i)        b[i]=s[b[0]-i]-'0';    c[0]=a[0]-b[0]+1;    for(int i=c[0];i>0;--i)        {            memset(t,0,sizeof(t));            cpy(b,t,i);            while(cmp(a,t)>=0)            ++c[i],jian(a,t);        }    while(c[0]>0&&c[c[0]]==0)        --c[0];    if(c[0]==0)        printf("0");    for(int i=c[0];i>0;--i)        printf("%d",c[i]);    printf("\n");    if(a[0]==0)        printf("0");    for(int i=a[0];i>0;--i)        printf("%d",a[i]);    return 0;}