高精度


C++常用数据类型范围

#include
using namespace std;
int main(){
    //数据类型范围定义在limits.h中
    printf("int\n字节数:%d\n最大值:%d\n最小值:%d\n",sizeof(int),INT_MAX,INT_MIN);
    printf("unsigned\n字节数:%d\n最大值:%u\n最小值:%u\n",sizeof(unsigned),UINT_MAX,0);
    printf("long long\n字节数:%lld\n最大值:%lld\n最小值:%lld\n",sizeof(long long ),LLONG_MAX,LLONG_MAX);
    printf("unsigned long long\n字节数:%d\n最大值:%llu\n最小值:%llu\n",sizeof(unsigned long long),ULLONG_MAX,0);
    //float.h
    printf("float\n字节数:%d\n最大值:%f\n最小值:%f\n正最小:%e\n",sizeof(float),FLT_MAX,-FLT_MAX,FLT_MIN);
    printf("double\n字节数:%d\n最大值:%e\n最小值:%e\n正最小:%e\n",sizeof(double),DBL_MAX,-DBL_MAX,DBL_MIN);
    printf("long double\n字节数:%d\n最大值:%Le\n最小值:%Le\n正最小:%e\n",sizeof(long double),LDBL_MAX,-LDBL_MAX,LDBL_MIN);
    //long double 完全输出用%Lf
    int x=0xfffffff;
    float y=0xfffffff;
    //由于float尾数为(有效位)为23,而int为31所以相同的数字float会有误差,即float牺牲精度换取范围
    printf("x:%d\ny:%f\n",x,y);
    return 0;
}

运行结果

那么当我们需要存储或计算的数据过大时,就需要使用高精度了。

高精度加法(四位压缩)

对于数字100456789
存储的时候是这个样子

参考代码

#include
// 高精度
// 四位压缩大法
using namespace std;
const int mlen=1e3,mod=1e4;
struct BD{
    int p[mlen],len;
    bool cha;//符号位 0为正,1为负
    BD(){
        memset(p,0,sizeof(p));
        len=0;//存储时从第零位开始存储,方便乘法运算
        cha=0;
    }
    BD(string &s){//字符串转高精
        memset(p,0,sizeof(p));
        len=0;
        int beg=0;
        if(s[0]=='-')cha=1,beg=1;
        else cha=0;
        for(int i=s.size()-1;i>=beg;i-=4){
            int sum=0,base=1;
            for(int j=0;j<4&&i-j>=beg;++j){
                sum+=(s[i-j]-'0')*base;
                base*=10;
            }
            p[len++]=sum;
        }
    }
    void print(){//打印高精度的函数
        if(cha)putchar('-');
        if(len==0){putchar('0');return ;}
        printf("%d",p[len-1]);//第一个四位数不需要前导零,单独打印
        for(int i=len-2;i>=0;--i){
            if(p[i]==0){
                printf("0000");
                continue;
            }
            for(int j=10;j*p[i]=0;--i){
        if(p[i]0&&c.p[c.len-1]==0){
        c.len--;
    }
    return c;
}
//高精乘高精
//n位数乘n位数最多得到2n位数
BD BD::operator*(const BD&a){
    BD c;
    c.cha=cha^a.cha;
    for(int i=0;i0&&c.p[c.len-1]==0)c.len--;
    return c;
}
int main(){
    string s1;
    string s2;
    cin>>s1>>s2;
    BD a(s1),b(s2);
    printf("s1+s2=");
    if(a.cha==b.cha)(a+b).print();
    else{
        if(a\(\cdots\)
运行结果