首页 > 其他分享 >高精度

高精度

时间:2024-05-04 20:24:27浏览次数:11  
标签:10 return 高精度 num BigInt len const

这是摘自 https://blog.csdn.net/SkeletonKing233/article/details/92200315 的一份高精度模板

# define FOR(i, a, b) for(int i = a; i <= b; i++)
# define _FOR(i, a, b) for(int i = a; i >= b; i--)

struct BigInt
{
    static const int M = 1000;
    int num[M + 10], len;

    BigInt() { clean(); }    

    void clean(){
        memset(num, 0, sizeof(num));
        len = 1;
    }

    void read(){
        char str[M + 10];
        scanf("%s", str);
        len = strlen(str);
        FOR(i, 1, len)
            num[i] = str[len - i] - '0';
    }

    void write(){
        _FOR(i, len, 1)
            printf("%d", num[i]);
        puts("");
    }
    
    void itoBig(int x){
        clean();
        while(x != 0){
            num[len++] = x % 10;
            x /= 10;
        }
        if(len != 1) len--;
    }

    bool operator < (const BigInt &cmp) const {
        if(len != cmp.len) return len < cmp.len;
        _FOR(i, len, 1)
            if(num[i] != cmp.num[i]) return num[i] < cmp.num[i];
        return false;
    }

    bool operator > (const BigInt &cmp) const { return cmp < *this; }
    bool operator <= (const BigInt &cmp) const { return !(cmp < *this); }
    bool operator != (const BigInt &cmp) const { return cmp < *this || *this < cmp; }
    bool operator == (const BigInt &cmp) const { return !(cmp < *this || *this < cmp); }

    BigInt operator + (const BigInt &A) const {
        BigInt S;
        S.len = max(len, A.len);
        FOR(i, 1, S.len){
            S.num[i] += num[i] + A.num[i];
            if(S.num[i] >= 10){
                S.num[i] -= 10;
                S.num[i + 1]++;
            }
        }
        while(S.num[S.len + 1]) S.len++;
        return S;
    }

    BigInt operator - (const BigInt &A) const {
        BigInt S;
        S.len = max(len, A.len);
        FOR(i, 1, S.len){
            S.num[i] += num[i] - A.num[i];
            if(S.num[i] < 0){
                S.num[i] += 10;
                S.num[i + 1]--;
            }
        }
        while(!S.num[S.len] && S.len > 1) S.len--;
        return S;
    }

    BigInt operator * (const BigInt &A) const {
        BigInt S;
        if((A.len == 1 && A.num[1] == 0) || (len == 1 && num[1] == 0)) return S;
        S.len = A.len + len - 1;
        FOR(i, 1, len)
            FOR(j, 1, A.len){
                S.num[i + j - 1] += num[i] * A.num[j];
                S.num[i + j] += S.num[i + j - 1] / 10;
                S.num[i + j - 1] %= 10;
            }
        while(S.num[S.len + 1]) S.len++;
        return S;
    }

    BigInt operator / (const BigInt &A) const {
        BigInt S;
        if((A.len == 1 && A.num[1] == 0) || (len == 1 && num[1] == 0)) return S;
        BigInt R, N;
        S.len = 0; 
        _FOR(i, len, 1){
            N.itoBig(10);
            R = R * N;
            N.itoBig(num[i]);
            R = R + N;
            int flag = -1;
            FOR(j, 1, 10){
                N.itoBig(j);
                if(N * A > R){
                    flag = j - 1;
                    break;
                }
            }
            S.num[++S.len] = flag;
            N.itoBig(flag);
            R = R - N * A;
        }
        FOR(i, 1, S.len / 2) swap(S.num[i], S.num[len - i + 1]);
        while(!S.num[S.len] && S.len > 1) S.len--;
        return S;
    }
    
    BigInt operator % (const BigInt &A) const {
        BigInt S;
        BigInt P = *this / A;
        S = *this - P * A;
        return S;
    }
};

标签:10,return,高精度,num,BigInt,len,const
From: https://www.cnblogs.com/9102qyy/p/18172615

相关文章

  • 高精度1588PTP时钟交换机,让工业通信领域全面革新
    高精度1588PTP时钟交换机,让工业通信领域全面革新 高精度1588PTP时钟交换机,让工业通信领域全面革新 京准电子科技官微——ahjzsz前言随着计算机和互联网技术的发展,以太网通信技术以其通信速率高、兼容性好、互联和可扩展性好等优点,在电力系统、交通、自动驾驶和自动化控制等......
  • AP5127 是一款 PWM 工作模式,高效率、外围简单、内置功率管,适用于 12-100V 输入的高精
    AP5127是一款PWM工作模式,高效率、外围简单、内置功率管,适用于12-100V输入的高精度降压LED恒流驱动芯片。输出最大功率可达25W,最大电流2.5A。AP5127可实现全亮/半亮功能切换,通过MODE切换:全亮/半亮/循环模式。AP5127工作频率固定在140KHZ,同时内置抖频电路,可以降低对......
  • AP5216 是一款 PWM工作模式, 高效率、外围简单、内置功率管,适用于5V~100V输入的高精度
    AP5216是一款PWM工作模式,高效率、外围简单、内置功率管,适用于5V~100V输入的高精度降压LED恒流驱动芯片。输出最大功率可达9W,最大电流1.0A。AP5216可实现全亮/半亮功能切换,通过MODE切换:全亮/半亮模式。AP5216工作频率固定在130KHZ,同时内置抖频电路,可以降低对其他设备......
  • decimal 高精度运算
    decimal高精度运算:https://blog.csdn.net/survivorsfyh/article/details/121700803?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171429544916800226541925%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=17142954491......
  • AP2915 是一款可以一路灯串切换两路灯串的降压恒流驱动器,高效率、外围简单、内置功率
    产品概述:AP8852是一款内部集成有功率MOSFET管的降压型开关稳压器。以电流模式控制方式达到快速环路响应并提高环路的稳定性。宽范围输入电压(4.5V至60V)提供0.5A电流的高效率输出,可在移动环境输入的条件下实现各种降压型电源变换的应用。0.1uA的关机静态电流适合电池供电场合的应......
  • 光学雨量计:高精度测量降水量的理想解决方案
    光学雨量计:高精度测量降水量的理想解决方案河北稳控科技光学雨量计是一种高精度测量降水量的理想解决方案。它利用光学原理,通过光束的衰减来测量降雨强度和累积降水量。相比传统的雨量计,光学雨量计具有更高的精度和可靠性,成为现代气象观测的重要工具。 传统的雨量计通过测量......
  • LED车灯驱动IC高精度电流输出±3%以内降压恒流芯片AP5161
    概述AP5161是一款高精度降压型大功率LED恒流驱动芯片。适用于输入电压100V以内的大功率LED恒流驱动电源。专利的高端电流检测、固定频率、电流模PWM控制方式,具有优异的线性调整率和负载调整率。芯片采用的特有恒流控制方式,使得LED输出电流精度达到±3%以内。芯片内部集......
  • 高精度
    高精度因为c++没有大数类,最大的类型是UNSIGNEDLONGLONG数值范围只有\([0,2^{64}-1]\),没法满足需要,int128似乎不是正统语言中的内容,略。所以高精度就是解决大数运算的技巧,把数组按位存储,一般从低位到高位。进制无所谓,但是常用10,为了节约复杂度有时会使用压位,即设\(10^k\)......
  • C++U7-1-高精度加减
    学习目标    高精度加法        [高精度加法] #include<bits/stdc++.h>usingnamespacestd;intmain(){stringa;stringb;intc[10089]={0};intd[10089]={0};inte[10089]={0};cin>>a>>b;in......
  • 「主席树维护高精度」 CF464E The Classic Problem
    发现难点在于维护\(dis_u\)(起点\(s\)到\(u\)的最短路)。如果使用暴力高精度,复杂度会乘上一个\(len\)。考虑边权\(2^w\)的特殊性质,如果使用一个二进制串来维护\(dis\),那么加上边权\(2^w\)相当于将二进制下某一段\(1\)置为\(0\),然后再将一个\(0\)置为\(1\)。说白了......