高精度模板---加、减、乘(非负数)
来源:互联网 发布:乐其网络 编辑:程序博客网 时间:2024/05/16 06:26
#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;struct Bigint{ bool f; // 0:+ 1; - 符号判断(可忽略) int size; //数位 int num[20000]; //数值 // 重载: 与函数类似,返回值类型 + operator + 重载符号 + ( 运算符右边的元素类型 ) // ps: 1.可以重载多个相同的运算符,不过要保证不完全相同 即 算符右边的元素类型不同( 高精*高精 高精*单精 ) // 2.本模板仅限于非负数之间的操作 , 如有负数,需加一些判断(ans正负 , 正+负==正- |负| )和处理(符号处理) // 3.除法略过(。。。。。) ,多半取模 inline void swap_(Bigint &x,Bigint &y) { Bigint tmp=x; x=y; y=tmp; } inline void swap_(int &x,int &y) { int tmp=x; x=y; y=tmp; } inline void del(Bigint &b)//去前导0 { for(;!b.num[b.size] && b.size>1;--(b.size)); } bool operator < (const Bigint &b) const { if(size!=b.size) return size<b.size; for(int i=1;i<=size;++i) if(num[i]^b.num[i]) // 等价于 num[i]!=b.num[i] return num[i]<b.num[i]; return 0; } Bigint operator + (const Bigint &b) //const + & 定义的元素不可更改 { // 高精+高精 Bigint p={0}; //同局部变量,必须要初始化 int m=size>b.size?size:b.size; int r=0; for(int i=1;i<=m;++i) { r+=num[i]+b.num[i]; p.num[i]=r%10; r/=10; } for(;r;r/=10) p.num[++m]=r%10; p.size=m; return p; } Bigint operator - (Bigint b)//不能改变原来的数值,所以不引用 { Bigint p=*this; // *this 等价 于 本结构体 if(p < b) { swap_(p,b); p.f=1; } int m=p.size>b.size?p.size:b.size; for(int i=1;i<=m;++i) { p.num[i]-=b.num[i]; if(p.num[i]<0) {p.num[i]+=10; --(p.num[i+1]);} } p.size=m; del(p); return p; } //对于乘法 当数值为1时,考虑删除前导0 Bigint operator * (const int x) {// 高精 * 单精 Bigint p={0}; int r=0,m=size; for(int i=1;i<=size;++i) { r+=num[i]*x; p.num[i]=r%10; r/=10; } for(;r;r/=10) p.num[++m]=r%10; p.size=m; del(p); return p; } Bigint operator * (const Bigint &b) {//高精 * 高精 Bigint p={0}; int r=0,m=size+b.size-1,p1=0; for(int i=1;i<=size;++i) { for(int j=1;j<=b.size;++j) { r+=num[i]*b.num[j]+p.num[i+j-1]; p.num[i+j-1]=r%10; r/=10; } for(p1=i+b.size-1;r;r/=10) { r+=p.num[++p1]; p.num[p1]=r%10; } if(p1>m) m=p1; } p.size=m; del(p); return p; } inline void turn (int x) //转化 (看情况,可改 long long) { for(;x;x/=10) num[++size]=x%10; } inline void in() //读入 { char c=getchar(); for(;'0'>c || c>'9';c=getchar()); for(;'0'<=c && c<='9';c=getchar()) num[++size]=c-'0'; for(int l=1,r=size;l<r;) swap_(num[l++],num[r--]); } inline void out() //输出 { if(f) putchar('-'); for(int i=size;i;--i) putchar(num[i]+'0'); putchar('\n');//自动换行 , 可删去 }}zero={0,1,0},one={0,1,{0,1}},two={0,1,{0,2}}; //常用数字 ;注意0的位数一定不能为0,否则不能输出 Bigint a,b,c;int main(){ printf("test:\n"); printf("请输入两串数字:\n"); a.in(); b.in(); printf("a+b: "); (a+b).out(); printf("a-b: "); (a-b).out(); printf("a*b: "); (a*b).out(); printf("a;"); a.out(); printf("b: "); b.out(); putchar('\n'); int x; printf("请输入一个int范围内的数:\n"); scanf("%d",&x); c.turn(x); printf("c: "); c.out(); printf("a*x: "); (a*x).out(); printf("a*c: "); (a*c).out(); system("pause"); return 0;}
阅读全文
0 0
- 高精度模板---加、减、乘(非负数)
- [模板]高精度加、减、乘
- 高精度非负数模板
- 高精度 加、减、乘、除 模板
- 高精度 加 减 乘
- 高精度加,减,乘,除,取模,模板
- 高精度模板总结(string 实现加、减、乘、除)常用版
- [复习]高精度 高精度加/减/乘/除法
- 【模板】高精度(加减乘)
- C++高精度(加/减/乘/除)【封装】
- 高精度非负数加法
- 高精度非负数减法
- c++高精度运算(加、乘)
- 高精度代码(PSACAL)加·减·乘·除(高精度 div 2)
- 【高精度计算】加减乘模板(水)
- 【模板】高精度--加减乘
- 支持负数的高精度模板
- 高精度模版:加,减,乘,带余除法
- python3 爬虫基础(一本书推荐)
- tomcat调试模式出问题的解决方法
- [树形DP] 51Nod1500 苹果曼和树
- httpclient模拟浏览器下载文件-常用方法集锦
- 函数的简单介绍
- 高精度模板---加、减、乘(非负数)
- 问题收集篇-Http访问域名的解析流程
- Eclipse中使用SVN
- 到底什么是用户体验?
- 第七周 项目一 【顺序环形队列】
- 学习SSM框架笔记五:利用五大组件采取配置文件和SpringMVC模式写HelloWorld
- 数据结构练习题 06-图3 六度空间 BFS
- 第五周项目4—数制转换
- MySQL事务效率测试