基础高精度

小学奥数由于太简单 先咕了

写一下高精度吧...

先贴上两种代码

第一种 easy版本

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
    char a1[1000],b1[1000];
    int a[1000],b[1000],c[1000],lena,lenb,lenc,i,x;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
     scanf("%s",a1);scanf("%s",b1);//scanf就爆0!
    lena=strlen(a1);
    lenb=strlen(b1);
    for(i=0;i<=lena-1;i++)
     a[lena-i]=a1[i]-48;
     for(i=0;i<=lenb-1;i++)
      b[lenb-i]=b1[i]-48;
      lenc=1;
      x=0;
      while(lenc<=lena||lenc<=lenb)
      {
          c[lenc]=a[lenc]+b[lenc]+x;
          x=c[lenc]/10;
          c[lenc]%=10;
          lenc++;
      }
      c[lenc]=x;
      if(c[lenc]==0)
      lenc--;
      for(i=lenc;i>=1;i--)
        cout<<c[i];
        cout<<endl;
        return 0;
    
}这个应该很好理解,以后贴上注释...

下面介绍另一种  重载运算符高精度+-*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int M=100000000,
          P=8;     //压位
 
struct bignum
{
    int n[5000],l;     //n数组存放每个结构体中的"大数",l记录长度。
    bignum(){l=1,memset(n,0,sizeof(n));}
//-----------------------------------------------
    void init()     //输入过程
    {
        string s;
        cin>>s;
        int now=0,ct=0,c1=1; //now记录当前是n数组的第几位,ct记录已经读入多少字符了,满八进一,c1是辅助变量,因为我们是倒着读入,所以每次要乘10
        for(int i=s.length()-1;i>=0;i--)  //从s的长度-1开始
        {
            n[now]+=(s[i]-'0')*c1;
            c1*=10;
            ct++;
            if(ct==P&&i!=0)  // 如果i=0了就没有必要now++;
            {
                now++;
                ct=0;
                c1=1;
            }        
        }
        l=now+1;   //l的长度为now+1;
    }
    void print()
    {
        printf("%d",n[l-1]);
        for(int i=l-2;i>=0;i--)    
        printf("%0*d",P,n[i]);  //补零输出
        printf("\n");
    }
//-----------------------------------------------
    bignum operator + (bignum x) const     //重载加号
    {
        bignum t=*this;
        if(x.l>t.l)t.l=x.l;
        for(int i=0;i<t.l;i++)
        {
            t.n[i]+=x.n[i];
            if(t.n[i]>=M)
            {
                t.n[i+1]+=t.n[i]/M;
                t.n[i]%=M;
            }
        }
        return t;            //  注意:将t的值返回
    }
//------------------------------------------------
    bool operator < (bignum x) const      //重载小于号
    {
        bignum t=*this;
        if(t.l!=x.l)return t.l<x.l;
        for(int i=t.l-1;i>=0;i--)
        {
            if(t.n[i]!=x.n[i]) return t.n[i]<x.n[i];
        }
        return 0;
    }
    bignum operator -(bignum x) const    //重载减号
    {
        bignum t=*this;
        if(t<x){printf("-");swap(t,x);}
        int jie =0;
        for(int i=0;i<t.l;i++)
        {
            t.n[i]-=x.n[i];
            while(t.n[i]<0)
            {
                t.n[i]+=M;
                jie++;        
            }
            t.n[i+1]-=jie;
            jie=0;
        }
        while(!t.n[t.l-1] && t.l>1)t.l--;  // 相减后有可能出现前面有0的情况,所以t.l--;
        return t;
    }
//----------------------------------------------
}a,b,c;
 
int main()
{
    a.init();        //读入字符串a和b
    b.init();
    
    c=a+b;                
    c.print();
 
    c=a-b;
    c.print();
    
    c=a*b;
    c.print();
        
    return 0;
}

注释咕咕咕

猜你喜欢

转载自www.cnblogs.com/tbdemons/p/10816044.html
今日推荐