首页 > 代码库 > 高精度加剪乘

高精度加剪乘

#include<stdio.h>
#include <cstring>
char n[255],m[255];
int n1[255],m1[255],s[510];
int bigjia(char *a,char *b)
{
    int a1[500],b1[500];
    int i,j,k=0,t;
    int lena=strlen(a);
    int lenb=strlen(b);
    for(i=0; i<lena; i++)
        a1[i]=a[i]-48;
    for(j=0; j<lenb; j++)
        b1[j]=b[j]-48;
    while(i>=0&&j>=0)
    {
        s[k]=a1[i]+b1[j];
        k++;
        i--;
        j--;
    }
    if(i>=0)
        while(i>=0)
        {
            s[k]=a1[i];
            k++;
            i--;
        }
    else if(j>=0)
        while(j>=0)
        {
            s[k]=b1[j];
            k++;
            j--;
        }
    for(t=1; t<k; t++)
        if(s[t]>=10)
        {
            s[t]%=10;
            s[t+1]++;
        }
    while(s[k]==0)
        k--;
    return k;
}
int bigcheng(char *n,char *m)
{
    int k=0,t,x=0,dig;
    int lenn=strlen(n);
    int lenm=strlen(m);
    for(int i=0; i<lenn; i++)
        n1[i]=n[i]-48;
    for(int j=0; j<lenm; j++)
        m1[j]=m[j]-48;
    for(int j=lenm-1; j>=0; j--)
    {
        t=k;
        for(int i=lenn-1; i>=0; i--)
        {
            s[t]+=n1[i]*m1[j];
            t++;
        }
        ++k;
        dig=t;
    }
    for(int i=0; i<dig; i++)
        while(s[i]>=10)
        {
            s[i]-=10;
            ++s[i+1];
        }
    return dig;
}
void exch_str(char*s1,char*s2)
{
    char tmp[1001];
    strcpy(tmp,s1);
    strcpy(s1,s2);
    strcpy(s2,tmp);
}
void bigjian(char *a,char *b)
{
    int a1[1001]= {0},b1[1001]= {0},s[1001]= {0},sign=1;
    int len_a,len_b,i,j,k=0,t;
    len_a=strlen(a);
    len_b=strlen(b);
    if(len_a<len_b)
    {
        sign=-1;
        exch_str(a,b);
        t=len_a;
        len_a=len_b;
        len_b=t;
    }
    else if(len_a==len_b)
    {
        for(i=0; i<len_a; ++i)
        {
            if(a[i]>b[i])
            {
                sign=1;
                break;
            }
            else if(a[i]<b[i])
            {
                sign=-1;
                exch_str(a,b);
                break;
            }
        }
    }
    else
    {
        sign=1;
    }
    for(i=0; i<len_a; ++i)
    {
        a1[i]=a[i]-'0';
    }
    for(j=0; j<len_b; ++j)
    {
        b1[j]=b[j]-'0';
    }
    while(i>=0&&j>=0)
    {
        s[k]=a1[i]-b1[j];
        if(s[k]<0)
        {
            a1[i-1]-=1;
            s[k]+=10;
        }
        k++;
        i--;
        j--;
    }
    while(i>=0)
    {
        s[k]=a1[i];
        k++;
        i--;
    }
    if(sign<0)
        printf("-");
    while(s[k]==0&&k>0)
    {
        k--;
    }
    if(k==0)
        printf("0");
    while(k>0)
    {
        printf("%d",s[k]);
        k--;
    }
}
int main()
{
    scanf("%s%s",&n,&m);
    int l=bigjia(n,m);
    for(int i=l; i>0; i--)
        printf("%d",s[i]);
    puts("");
    memset(s,0,sizeof(s));
    int ll=bigcheng(n,m);
    if(s[ll]!=0)
        for(int i=ll; i>=0; i--)
            printf("%d",s[i]);
    else
        for(int i=ll-1; i>=0; i--)
            printf("%d",s[i]);
    puts("");
    memset(s,0,sizeof(s));
    bigjian(n,m);
    return 0;
}

高精度加剪乘