首页 > 其他分享 >高精度(较难)

高精度(较难)

时间:2024-04-01 12:59:06浏览次数:27  
标签:10 return 高精度 int ++ BigInt 较难 operator

struct BigInt {
 
    int n, f;  // n 是位数, f = 1 是正数, f = -1 是负数
    int a[N];
     
    BigInt(): n(0), f(1) {}
     
    BigInt(int x) {
        n = 0, f = (x < 0 ? -1 : 1);
        x = f * x;
        while (x != 0) a[n++] = x % 10, x /= 10;
    }
     
    BigInt(string& A) {
        n = 0, f = (A[0] == '-' ? -1 : 1);
        for (int i = (int) A.size() - 1; i >= (f == -1 ? 1 : 0); i--) a[n++] = A[i] - '0';
    }
     
    BigInt& operator =(int x) {
        n = 0, f = (x < 0 ? -1 : 1);
        x = f * x;
        while (x != 0) a[n++] = x % 10, x /= 10;
        return *this;
    }
     
    BigInt& operator =(const BigInt& x) {
        n = 0, f = x.f;
        for (int i = 0; i < x.n; i++) a[n++] = x.a[i];
        return *this;
    }
     
    // 判断正负, 进位/借位, 删除前导 0
    void arrange() {
        // 先判断正负, 取决于最高的非 0 位的正负
        f = 1;  // 默认是正数, 因为有可能是 0
        for (int i = n - 1; i >= 0; i++) if (a[i] != 0) {
            f = (a[i] < 0 ? -1 : 1);
            break;
        }
         
        int d = 0;  // 借位或者进位
        for (int i = 0; i < n; i++) {
            int t = a[i] * f + d;
            a[i] = t % 10;
            d = t / 10;
            if (a[i] < 0) a[i] += 10, d--;
        }
        if (d > 0) a[n++] = d;
        while (n > 1 && a[n - 1] == 0) n--; 
    }
     
    // BigInt + BigInt 
    BigInt operator +(const BigInt& x) {
        BigInt z;
        z.n = max(n, x.n);
        for (int i = 0; i < z.n; i++) z.a[i] = 0;
        for (int i = 0; i < n; i++) z.a[i] += f * a[i];
        for (int i = 0; i < x.n; i++) z.a[i] += x.f * x.a[i];
        z.arrange();
        return z;
    }
 
    // BigInt + int 
    BigInt operator +(int x) {
        BigInt w = x;
        return *this + w;
    }
     
    // BigInt - Bigint 
    BigInt operator -(const BigInt& x) {
        BigInt w = x;
        w.f *= -1;
        return *this + w;
    }
     
    // BigInt - int 
    BigInt operator -(int x) {
        BigInt w = x;
        return *this - w;
    }
 
    // BigInt * Bigint 
    BigInt operator *(const BigInt& x) {
        BigInt z;
        z.n = n + x.n - 1;
        for (int i = 0; i < z.n; i++) z.a[i] = 0;
        for (int i = 0; i < n; i++) for (int j = 0; j < x.n; j++) {
            z.a[i + j] += f * a[i] * x.f * x.a[j];
        }
        z.arrange();
        return z;
    }
     
    // BigInt * int 
    BigInt operator *(int x) {
        BigInt w = x;
        return *this * w;
    }
     
    // BigInt / int, 只支持正数
    BigInt operator /(int x) {
        int d = 0;
        BigInt z = *this;
        for (int i = n - 1; i >= 0; i--) {
            d = d * 10 + a[i];
            z.a[i] = d / x;
            d = d % x;
        }
        while (z.n > 1 && z.a[z.n - 1] == 0) z.n--;
        return z;
    }
     
    // BigInt % int, 只支持整数
    int operator %(int x) {
        int y = 0;
        for (int i = n - 1; i >= 0; i--) {
            y = y * 10 + a[i];
            y = y % x;
        }
        return y;
    }
     
    void print() {
        if (n == 0) cout << 0 << '\n';
        else {
            if (f == -1) cout << '-';
            for (int i = n - 1; i >= 0; i--) cout << a[i];
            cout << '\n';
        }
    }
};

这个语法真的很难!希望有人能看懂好吧。。

标签:10,return,高精度,int,++,BigInt,较难,operator
From: https://blog.csdn.net/2301_76841790/article/details/137174807

相关文章

  • 高精度算法
    高精度通常,大整数的存储采用数组的形式,其中数组的首位存储大整数的最低位,末位存储最高位举例来说,对于整数123456789,我们可以使用数组存储如下:makefileCopycodeindex:012345678array:[9,8,7,6,5,4,3,2,1]这样,数组的第一......
  • 高精度算法(大数的加、减、乘、除)
    在C/C++中,int占一个机器字长,32位机中则占4个字节,即[-2^31,2^31-1](10的9次方数量级)。不管是32位还是64位机,longlong占8个字节,即[-2^63,2^63-1](10的18次方数量级)。如果超过该数量级,应该使用高精度算法。1加1、将两个加数逆序存储在两个int数组中。(逆序的原因是方便操作和数......
  • 高精度AI火灾烟雾检测算法,助力打造更加安全的楼宇环境
    一、方案背景近日,南京居民楼火灾事故导致15人死亡的新闻闹得沸沸扬扬,这一事件又激起了大家对楼宇火灾隐患的进一步担忧。事后我们除了思考政府、消防及物业部门应对此事的解决办法,我们还应该思考如何利用现有的技术帮助人们减少此类事情的发生。二、方案概述含有AI智能分析高精......
  • luoguP3330 [ZJOI2011] 看电影--组合数学--高精度
    \(luoguP3330\)[ZJOI2011]看电影废了老命想题解$$luogu$$$$HZOI$$题意到了难得的假期,小白班上组织大家去看电影。但由于假期里看电影的人太多,很难做到让全班看上同一场电影。最后大家在一个偏僻的小胡同里找到了一家电影院,但这家电影院分配座位的方式很特殊,具体方式如......
  • 【模板】高精度计算
    //高精度加法vector<int>add(vector<int>&A,vector<int>&B){ vector<int>ans; if(A.size()<B.size())returnadd(B,A); for(inti=0,t=0;i<A.size();i++){ t+=A[i]; if(i<B.size())t+=B[i]; ans.pus......
  • FLUKE 5730A 高精度多功能校准器
    计量专家必备之校准器 5730A提供了性能良好的直流/低频信号,专为校准专业人士所需。包括:国家级校准实验室,军队,国防,第三方校准实验室,企业内部校准实验室等等。5730A高精度校准器可溯源至国家标准,遵循ISO17025的认证要求。技术指标中分别给出了99%置信度及95%置信度水平的指标,......
  • Python疑难杂症(13)---Python的几个比较难理解的内置函数,包括range、zip、map、lambda
    1、range()range(start=0, stop[, step=1])构造器的参数必须为整数(可以是内置的 int 或任何实现了 __index__() 特殊方法的对象)。生成一个start到stop的数组,左闭右开, 类型表示不可变的数字序列,通常用于在 for 循环中循环指定的次数。list(range(6))[0,1,2,3......
  • c++高精度减法的方法和示例代码
    C++中的高精度减法指的是在处理大数时,执行减法操作的方法。通常情况下,C++内置的数据类型(如int、long、double等)可能无法满足大数运算的需求,因为它们的范围有限。在这种情况下,需要使用自定义的数据结构或者字符串来表示大数,并实现相应的算术操作。以下是执行高精度减法的基本思......
  • YOLOv9改进策略:注意力机制 |通道注意力和空间注意力CBAM | GAM超越CBAM,不计成本提高精
    ......
  • 数据结构算法系列----高精度加法(大数相加)、处理前导零
    目录一、为什么要使用高精度加法二、处理前导零1、为什么要处理前导零2、处理前导零的代码三、处理大数相加四、完整代码即例题一、为什么要使用高精度加法  当处理远大于longlong数据范围的数时,通常会将这些大数表示为字符串,然后通过字符串的方式进行加减乘除......