高精

 

高精加

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define FORa(i,s,e) for(int i=s;i<=e;i++)
#define FORs(i,s,e) for(int i=s;i>=e;i--)

using namespace std;

const int N=100000;
string sta,stb;
int a[N+1],b[N+1],len;
void Init(int a[],string &st)
{
    cin>>st,a[0]=st.size();
    FORa(i,1,a[0]) a[i]=st[a[0]-i]-'0';
}
int main()
{
    Init(a,sta),Init(b,stb),len=a[0]>b[0]?a[0]:b[0]+1;//记得判断两者解的长度 
    FORa(i,1,len) a[i]+=b[i],a[i+1]+=a[i]/10,a[i]%=10;
    while(!a[len]&&len>1) len--;//删除前导零 
    FORs(i,len,1) printf("%d",a[i]);
    return 0;
}

高精减

#include<stdio.h>
#include<stdlib.h>
#include<iostream> 
#define FORa(i,s,e) for(int i=s;i<=e;i++)
#define FORs(i,s,e) for(int i=s;i>=e;i--)
using namespace std;

const int N=100000;
int a[N+1],b[N+1];
string sta,stb;
void Init(int a[],string &st)
{
    cin>>st,a[0]=st.size();
    FORa(i,1,a[0]) a[i]=st[a[0]-i]-'0';
}
int main()
{
    Init(a,sta),Init(b,stb);
    FORa(i,1,a[0])
    {
        a[i]-=b[i];
        if(a[i]<0) a[i+1]--,a[i]+=10;//借位 
     }
     while(!a[a[0]]&&a[0]>1) a[0]--;//删除前导零 
     FORs(i,a[0],1) printf("%d",a[i]);
    return 0;
}

高精乘

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define FORa(i,s,e) for(int i=s;i<=e;i++)
#define FORs(i,s,e) for(int i=s;i>=e;i--)

using namespace std;

const int N=1000;
int a[N+1],b[N+1],c[N+1];
string sta,stb;
void Init(int p[],string &s)
{ 
    cin>>s,p[0]=s.size();
    FORa(i,1,p[0]) p[i]=s[p[0]-i]-'0';
} 
int main()
{
    Init(a,sta),Init(b,stb);
    FORa(i,1,a[0])    
    {
        int x=0;
        FORa(j,1,b[0])
            c[i+j-1]=a[i]*b[j]+c[i+j-1]+x,x=c[i+j-1]/10,c[i+j-1]%=10;//加上本身与前者的进位与本应该加上的值 
        c[i+b[0]]=x;//别忘记处理进位的小尾巴 
    }
    c[0]=a[0]+b[0]+1;
    while(!c[c[0]]&&c[0]>1)  c[0]--;//删除前导零 
    FORs(i,c[0],1) printf("%d",c[i]);
    return 0;
}

高精除

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define FORa(i,s,e) for(int i=s;i<=e;i++)
#define FORs(i,s,e) for(int i=s;i>=e;i--)

using namespace std;

const int N=1000;
int a[N+1],b,c[N+1];
string s;
void Init(int p[],string &s)
{ 
    cin>>s,p[0]=s.size();
    FORa(i,1,p[0]) p[i]=s[i-1]-'0';//存储方式与其它高精度处理不一样,正序储存 
} 
int main()
{
    int x=0;
    Init(a,s),scanf("%d",&b);
    FORa(i,1,a[0])
    {
        c[i]=(x*10+a[i])/b;//注意商与余数要继承之前的答案 
        x=(x*10+a[i])%b;
    } 
    int sp=1;
    while(!c[sp]&&sp<a[0]) sp++;//删除前导零,但因为储存方式的不一样,删除的方式也不一样 
    FORa(i,sp,a[0]) printf("%d",c[i]);
    return 0;
}

原文地址:https://www.cnblogs.com/SeanOcean/p/11181793.html