【Alogrithm】高精加(搬运)

#define r register int // register关键字将变量存储在CPU寄存器中,可以提高效率
struct BigInteger
{
    char str[100001];     // str数组用于存储字符串
    int num[100001], len; // num数组为str数组转为int类型的结果,len为str的长度,也就是num的大小
    inline void output()
    { // 输出函数,由于是反向模拟加法的,所以也需要反向输出
        for (r i = len - 1; i + 1; --i)
            printf("%d", num[i]);
    }
    BigInteger operator+(BigInteger &k)
    { // 开始重载了,加法竖式模拟也不需要多解释
        len = max(len, k.len);
        r f = 0;
        for (r i = 0; i ^ len; ++i)
        {
            num[i] += k.num[i] + f;
            if (num[i] > 9)
                num[i] -= 10, f = 1;
            else
                f = 0;
        }
        if (f)
            num[len++] = 1; // 这里是对进位的处理
        return *this;       //*this返回一个指向类本身的指针
    }
    BigInteger()
    { // 初始化,清零所有变量和数组
        len = 0;
        memset(str, 0, sizeof str);
        memset(num, 0, sizeof num);
    }
    BigInteger(int k)
    { // 将BigInteger类型赋为int类型,也可当做强制转换使用
        memset(str, 0, sizeof str);
        sprintf(str, "%d", k);        // sprintf与printf类似,可以当做将数值打印到字符串中,具体用法请自行度娘(笑)
        len = strlen(str);            // 保存字符串长度
        std::reverse(str, str + len); // 由于需要反向模拟竖式,所以我们在这里就调用STL的reverse函数将str字符串倒过来
        for (r i = 0; i ^ len; ++i)
            num[i] = str[i] - 48; // 将字符串转为int类型
    }
};
posted @ 2025-03-09 12:28  NeoAxiomN  阅读(18)  评论(0)    收藏  举报