
C++高精度模板
发布日期:2021-05-09 04:43:46
浏览次数:8
分类:博客文章
本文共 2358 字,大约阅读时间需要 7 分钟。
#define rg registerconst int maxn=2005,bas=10000;struct jie{ int num[maxn],len; bool jud; jie(){ memset(num,0,sizeof(num)); len=jud=0; } friend bool operator <(const jie& A,const jie& B){ if(A.lenB.len) return 0; for(rg int i=A.len;i>=1;i--){ if(A.num[i] B.num[i]) return 0; } return 0; } friend jie operator + (const jie& A,const jie& B){ rg jie C; C.len=std::max(A.len,B.len); for(rg int i=1;i<=C.len;i++){ C.num[i]+=A.num[i]+B.num[i]; if(C.num[i]>=bas){ C.num[i]-=bas; C.num[i+1]++; } } if(C.num[C.len+1]) C.len++; return C; } friend jie operator -(const jie& A,const jie& B) { rg jie C; int js[maxn]; if(A =A.num[i]){ C.num[i]=B.num[i]+js[i]-A.num[i]; } else { C.num[i]=B.num[i]+js[i]-A.num[i]+bas; js[i+1]-=1; } } C.jud=1; } else { C.len=A.len; for(rg int i=1;i<=C.len;i++){ if(A.num[i]+js[i]>=B.num[i]){ C.num[i]=A.num[i]+js[i]-B.num[i]; } else { C.num[i]=A.num[i]+js[i]-B.num[i]+bas; js[i+1]-=1; } } C.jud=0; } while(!C.num[C.len]) C.len--; return C; } friend jie operator * (const jie& A,const jie& B){ rg jie C; C.len=A.len+B.len; for(rg int i=1;i<=A.len;i++){ for(rg int j=1;j<=B.len;j++){ C.num[i+j-1]+=A.num[i]*B.num[j]; if(C.num[i+j-1]>=bas){ C.num[i+j]+=C.num[i+j-1]/bas; C.num[i+j-1]%=bas; } } } if(!C.num[C.len]) C.len--; return C; } friend jie operator /(const jie &A,const int &B){ rg jie C; C.len=A.len; rg long long nans=0; for(rg int i=A.len;i>=1;i--){ nans=nans*bas+A.num[i]; if(nans>=B){ C.num[i]=nans/B; nans%=B; } } while(!C.num[C.len]) C.len--; return C; } friend int operator %(const jie &A,const int &B){ rg long long nans=0; for(rg int i=A.len;i>=1;i--){ nans=nans*bas+A.num[i]; if(nans>=B) nans%=B; } return nans; } void read(rg int val){ len=0,jud=0,memset(num,0,sizeof(num)); while(val){ num[++len]=val%bas; val/=bas; } } void autoread(){ char s[maxn]; scanf("%s",s+4); rg int len2=strlen(s+4); s[0]=s[1]=s[2]=s[3]='0'; len=0; for(rg int i=len2+3;i>=4;i-=4){ num[++len]=(s[i-3]-'0')*1000+(s[i-2]-'0')*100+(s[i-1]-'0')*10+s[i]-'0'; } while(num[len] && !len) len--; } void write(){ if(len && jud) printf("-"); if(!len) printf("0\n"); if(len) printf("%d",num[len]); for(rg int i=len-1;i>=1;i--){ printf("%04d",num[i]); } printf("\n"); }};
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月02日 15时41分56秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
OAuth2.0认证详解
2021-05-09
如何禁用控制台窗口的关闭按钮?
2021-05-09
Netflix是什么,与Spring Cloud有什么关系
2021-05-09
对象的可见性 - volatile篇
2021-05-09
端口重用
2021-05-09
为什么面试完,总是让你回去等通知?
2021-05-09
Java 中初始化 List 集合的 6 种方式!
2021-05-09
终于有人把 HTTPS 原理讲清楚了!
2021-05-09
别乱提交代码了,看下大厂 Git 提交规范是怎么做的!
2021-05-09
在滴滴和头条干了 2 年后端开发,太真实…
2021-05-09
送给你 12 个 Git 使用技巧!
2021-05-09
使用 Redis 实现一个轻量级的搜索引擎,牛逼!
2021-05-09
你还在用分页?试试 MyBatis 流式查询,真心强大!
2021-05-09
你还在用命令看日志?快用 Kibana 吧,一张图片胜过千万行日志!
2021-05-09
python进阶(3)json文件与python字典的转化
2021-05-09
Linux中对用户操作
2021-05-09
大数据整理——数据集成
2021-05-09
Linux查看CUDA和cuDNN版本
2021-05-09
centos修改mysql5.7默认端口后启动异常
2021-05-09
java面试系列<4>——IO
2021-05-09