高精度之重载运算符

本文探讨了如何将高精度运算与C++的重载运算符结合,以简化高精度计算的过程。首先解释了重载运算符的概念,即自定义已存在的运算符行为。接着通过例子展示了如何重载加法运算符`+`,并提供了高精度加法的伪代码。虽然文中给出的模板未考虑负数情况,但分享了两个应用重载运算符的实际问题:凸多边形三角划分和矩阵快速幂。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更好的阅读体验请点击

前言


高精运算大家都不陌生,重载运算符也听过。
将高精度和重载运算符加在一起,高精度运算将变得非常简单

 

什么是重载运算符?


简单来说,重载运算符就是自己定义一种新的运算方式(符号必须是c++中已有的);
然后与系统已有的运算符为媒介进行运算。

怎么重载?

node operator *(node x,node y){
    node res;
    return res;
}


先给个式子:
A=B+C


其中 node 是 A 的类型,operator 是重载的标志,* 是要重载的符号
代码括号中的 x 是 B 的类型,y 是 C 的类型
通俗一点讲就是:被重载的运算符的左边和右边分别是x和y(类型是node);
运算结果是 res(类型也为node)。

 

伪代码


返回类型 operator 重载的符号 (重载符号左边的运算类型,重载符号右边的运算类型){
    .........(代码)
    return 等号左边的类型;
}

高精度加法与乘法内附有压位
一个比较不错的高进度运算模板
但未考虑负数的情况

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
#define LL long long
#define B 100000000           //压位
#define MAXN 20018
using namespace std;

struct G{
    LL k[MAXN];
}a,b;                       //a,b为运算数字
char s1[MAXN];
char s2[MAXN];

//输出答案
inline void out(G x){     
    printf("%lld",x.k[x.k[0]]);   //最高位单独输出
    for(LL i=x.k[0]-1;i>=1;--i) printf("%08lld",x.k[i]);    //其余补零输出
    printf("\n");
}

//重载乘号
G operator *(G x,G y){
    G res;  //返回值
    memset(res.k,0,sizeof(res.k));  //局部定义要清零
    LL lenx=x.k[0],leny=y.k[0];
    LL len=lenx+leny-1;             //乘完后的长度,不是最终长度,要进位
    for(LL i=1;i<=lenx;++i){        //统一乘法
        for(LL j=1;j<=leny;++j){
            res.k[i+j-1]+=(x.k[i]*y.k[j]);
        }
    }
    for(LL i=1;i<len;++i){          //统一进位
        res.k[i+1]+=res.k[i]/B;
        res.k
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值