高精度算法:大数加减法&大数乘法&比较

博客目录

一、题目描述

给出两个不超过500位的正整数,输出相应的运算结果。

二、代码

注意:乘法时用char类型的数值可能超出上限。

使用重载运算符定义:

#include<stdio.h>    //大数乘法,加法,比较大小
#include<string.h>
using namespace std;
typedef struct 
{
    int len;         //字符串长度    
    char co[600];
}Big;                //大数类型
Big operator+ (Big a,Big b)    //a,b>=0 (要考虑结果为0,不能反回空字符串,即最后加\0时不能加在第0位) 
{
    int i;
    int cu=0;
    Big c;
    c.co[0]='1'; 
    char *x,*y;
    int alen;
    x=a.co;
    y=b.co;
    alen=a.len;
    int blen=b.len;
    if(a.len<b.len)
    {
        x=b.co;
        y=a.co;    //x,alen 长 
        alen=b.len;
        blen=a.len;
    }
    c.len=alen;
    for(i=1;i<=alen;i++)
        c.co[i]=x[i-1];
    
    c.co[alen+1]=0;
    c.co[0]='0';
    cu=0;
    for(i=alen;i>=1;i--)
    {
        c.co[i]=x[i-1];
    }
    for(i=0;i<blen;i++)
    {
        c.co[alen-i]+=y[blen-i-1]+cu-'0';
        cu=0;
        if(c.co[alen-i]>'9')
        {
            c.co[alen-i]-=10;
            cu=1;
        }
    }                // 012  012
    for(i=alen-blen;i>=0 && cu;i--)    // 098 +002
    {
        c.co[i]+=cu;
        cu=0;
        if(c.co[i]>'9')
        {
            c.co[i]-=10;
            cu=1;
        }
    }
    if(i==-1)
    {
        c.len++;
    }
    else
    {
        for(i=0;i<alen;i++)
        {
            c.co[i]=c.co[i+1];
        }
        if(alen==0)
            alen=1;
        c.co[alen]=0;
    }
    return c;
}

Big operator*(Big a,Big b)
{
    Big c;
    int out[600];
    int len=a.len+b.len;    
    int i,j;                //       n位数 乘以 m位数,结果小于等于 n+m 位数 
    for(i=0;i<len;i++)             
    {                    
        out[i]='0';               
    }
    out[len]=0;
    int cu=0;
    int t;
    for(i=0;i<b.len;i++)        //199 93
    {
        for(j=0;j<a.len;j++)
        {  
            t=(b.co[b.len-1-i]-'0')*(a.co[a.len-1-j]-'0')+out[len-1-i-j]-'0';
             if(t>9)
            {
                cu=t/10;
                t%=10;
                out[len-1-i-j-1]+=cu;
            }
            out[len-1-i-j]=t+'0';
        }
    }
    
    for(i=0;i<len && out[i]=='0';i++);
    c.len=len-i;
    for(j=0;i<len;j++)
    {
        c.co[j]=out[i++];
    }
    c.co[j]=0;
    return c;
} 
int operator< (Big a,Big b)        //大数比较,要考虑字符串长度,(strcmp不能判断长度) 
{
    
    if(a.len==b.len)
        return strcmp(a.co,b.co)<0;
    else 
        return a.len<b.len;
}
int main()
{
}

 

猜你喜欢

转载自blog.csdn.net/greybtfly/article/details/79349149