高精度四则运算

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
const int MAXLEN=1000;
int *str_to_int(char *str)
{
    int len=strlen(str);
    int *a=new int[(len+1)*sizeof(int)];
    for(int i=0;i<len;i++) a[i]=(int)str[len-i-1]-'0';
    return a;
}

//整数数组的归零运算
int check(int *a,int n)
{
    int k=0,len=n;
    while(a[len-1]==0&&len>1) len--;//去掉前导数字0,确定数组当前长度
    for(k=0;k<len;k++)
    {
        if(a[k]>=10)
        {//对数值超过九的进行归零处理
            a[k+1]=a[k+1]+a[k]/10;
            a[k]=a[k]%10;
        }
    }
    if(a[k]!=0) len=k+1;    //
    return len;
}

//整型数组转化为字符数组,以备后用
char *int_to_str(int *a,int n)
{
    int i;
    char *str=new char[(n+1)*sizeof(char)];
    for(i=0;i<n;i++) str[i]=(char)a[n-1-i]+'0';
    str[n]='\0';
    return str;
}

char *addition(char *m1,char *m2)
{
    int len1,len2,len,c=0;
    int *t1,*t2;
    len1=strlen(m1);len2=strlen(m2);
    len=(len1>=len2)?len1:len2;
    t1=new int[(len1+2)*sizeof(int)];
    t2=new int[(len2+2)*sizeof(int)];
    t1=str_to_int(m1);
    t2=str_to_int(m2);
    for(int i=len1;i<=len;i++) t1[i]=0;
    for(int i=len2;i<=len;i++) t2[i]=0;
    for(int i=0;i<len;i++) t1[i]=t1[i]+t2[i];
    len=check(t1,len);
    return int_to_str(t1,len);
}

char *subtract(char *m1,char *m2)
{
    int i, len1,len2,len,c=0,*t1,*t2,cf=0;
    char *temp,*csub;
    len1=strlen(m1);len2=strlen(m2);
    len=len1>=len2?len1:len2;   //定位数
    t1=new int[(len+2)*sizeof(int)];
    t2=new int[(len+2)*sizeof(int)];
    temp=new char[(len+2)*sizeof(char)];
    csub=new char[(len+3)*sizeof(char)];
    if((len>len1)||((len2==len1)&&strcmp(m1,m2)<0))
    {   //当被减数小于减数时调整
        strcpy(temp,m1);strcpy(m1,m2);strcpy(m2,temp);
        len1=strlen(m1);len2=strlen(m2);
        cf=1;
    }
    t1=str_to_int(m1);t2=str_to_int(m2);
    for(i=len1;i<len;i++) t1[i]=0;  //缺位前补0
    for(i=len2;i<len;i++) t2[i]=0;
    for(i=0;i<len;i++)
    {
        if(t1[i]>=t2[i]) t1[i]=t1[i]-t2[i];     //归整
        else
        {
            t1[i]=t1[i]-t2[i];
            c=(t1[i]*(-1)/10+1);
            t1[i]=t1[i]+10*c;
            t1[i+1]=t1[i+1]-c;
        }   
    }
    int n=i,begin=0;
    while(t1[n-1]==0&&n>1) n--;
    if(cf==1)
    {
        csub[0]='-';
        n++;begin=1;
    }
    for(i=begin;i<n;i++)
    csub[i]=(char)t1[n-1-i]+'0';
    csub[n]='\0';
    return csub;
}

char *multiply(char *m1,char *m2)
{
    int i,len1,len2,len,j,c=0,*t1,*t2,*prod;
    len1=strlen(m1);len2=strlen(m2);
    len=len1+len2;
    t1=new int[(len1+1)*sizeof(int)];
    t2=new int[(len2+1)*sizeof(int)];
    prod=new int[(len+1)*sizeof(int)];
    t1=str_to_int(m1);t2=str_to_int(m2);
    for(i=0;i<len;i++) prod[i]=0;
    for(i=0;i<len1;i++)
    for(j=0;j<len2;j++)
    prod[i+j]=prod[i+j]+t1[i]*t2[j];
    len=check(prod,len);
    return int_to_str(prod,len);
}

int cmp(char s1[],char s2[])
{
    int len1=strlen(s1);
    int len2=strlen(s2);
    if(len1!=len2)
    {
        if(len1>len2) return 1;
        else return -1;
    }
    else
    {
        int ans=strcmp(s1,s2);
        if(ans>0) return 1;
        else if(ans==0) return 0;
        else return -1;
    }
    
}

void divide(char *m1,char *m2,char *remainder,char *quotient)
{
    int i,j,k,len,*temp;
    int len1=strlen(m1);
    int len2=strlen(m2);
    char *m3;
    if(strcmp(m1,m2)==0)
    {
        strcpy(quotient,"1");
        strcpy(remainder,"0");
    }
    else 
    if((len1<len2)||(len1==len2&&strcmp(m1,m2)<0))
    {
        strcpy(quotient,"0");
        strcpy(remainder,m1);
    }
    else
    {
        temp=new int[(len2+1)*sizeof(int)];
        len=0;
        for(i=0;i<len1;i++)
        {
            temp[i]=0;
            remainder[len]=m1[i];
            remainder[len+1]='\0';
            len=strlen(remainder);
            while((len>len2)||(len==len2&&strcmp(remainder,m2)>=0))
            {
                m3=new char[(len1+1)*sizeof(char)];
                memset(m3,0,sizeof(m3));
                strcpy(m3,subtract(remainder,m2));
                strcpy(remainder,m3);
                len=strlen(remainder);
                temp[i]++;
            }
            quotient[i]=temp[i]+'0';
        }
        j=0;
        while((j<len1)&&(quotient[j]=='0')) j++;
        for(k=0;k<len1-j;k++) quotient[k]=quotient[k+j];
        quotient[len1-j]='\0';
        if(remainder[0]==0)
        {
            remainder[0]='0';
            remainder[1]='\0';
        }
    }
    
}



int main()
{
    char s1[MAXLEN],s2[MAXLEN];
    cin>>s1>>s2;
    cout<<multiply(s1,s2)<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值