大整数的四则运算
2015-11-20 21:46
351 查看
大整数的四则运算经常用到,有必要专门写一个数据结构当以后用到的时候可以直接使用,原理就是四则运算的笔算,但是写起来细节还是挺多的,虽然并不是很完善,但是一般用来应该足够了
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define MAXN 1000 using namespace std; char Ts[MAXN];/*存储tostring的返回值*/ struct bign{ int len; /*bign的位数*/ char s[MAXN]; /*存储bign的各个位,char类型足够了,如果要更省空间一个char类型可以存储2个十进制的数*/ /** 注:简单起见,并没有设置符号位,定义的全都是unsign的大整数, * 编程时遇到有符号的数时容易通过预处理得到无符号数,并通过 * 结构中提供的重载的比较运算符得到正确的结果 **/ bign(){ /*构造函数,声明bign时自动初始化bign*/ len=1; memset(s,0,sizeof(s)); } bign operator = (int num){ /*运算符‘=’重载,当‘=’右面为整数时调用*/ char a[MAXN]; sprintf(a,"%d",num); *this=a; return *this; } bign operator =(const char *num){ /*运算符‘=’重载,当‘=’右面为字符串时调用*/ len=strlen(num); for(int i=0;i<len;i++) s[i]=num[len-1-i]-'0'; return *this; } bign operator =(const bign &r){ len=r.len; memcpy(s,r.s,sizeof(r.s)); return *this; } string tostring ()const{ /*将bign转换为字符串,便于输出*/ char *p=Ts; for(int i=len-1;i>=0;i--) *(p++)=s[i]+'0'; *p='\0'; return Ts; } bign operator +(const bign &r){ bign a; int i,c=0,l=len>r.len?len:r.len; for(i=0;i<l;i++){ if(i<r.len) c+=r.s[i]+s[i]; else c+=s[i]; a.s[i]=c%10; c/=10; } (c>0)?(a.s[l]=c,a.len=l+1):(a.len=l); return a; } void clean() { while(len > 1 && !s[len-1]) len--; } bign operator -(const bign &r){ bign a; int i,c=0,l=len>r.len?len:r.len; for(i=0;i<l;i++){ int x=s[i]-c; if(i<r.len) x-=r.s[i]; if(x<0){ c=1; x+=10; }else c=0; a.s[i]=x; } a.len=l; a.clean(); return a; } bign operator *(const bign &r){ bign a; a.len=(len+r.len)>MAXN?(len+r.len):MAXN; for(int i=0;i<len;i++) for(int j=0;j<r.len;j++) a.s[i+j]+=s[i]*r.s[j]; for(int i=0;i<a.len;i++){ a.s[i+1]+=a.s[i]/10; a.s[i]%=10; } a.clean(); return a; } bign operator /(const bign &r){ bign a,b,c; a=*this; b=r; div(a,b,c,a.len,b.len); c.len=a.len-b.len+1; c.clean(); return c; } void div(bign &a,bign &b,bign &c,const int l1,int l2){ bign x; x.len=l2; memcpy(x.s,a.s+l1-l2,sizeof(char)*l2); x.clean(); if(l1<l2||(l1==l2&&x<b)) return; if(x<b){ div(a,b,c,l1,l2+1); }else{ while(x>=b){ x=x-b; c.s[l1-l2]++; } memcpy(a.s+l1-l2,x.s,sizeof(char)*l2); div(a,b,c,l1,l2+1); } } bool operator < (const bign &r)const{ if(len!=r.len) return len<r.len; for(int i=len-1;i>=0;i--) if(s[i]!=r.s[i]) return s[i]<r.s[i]; return 0; } bool operator > (const bign &r)const{ return r < *this; } bool operator <= (const bign &r)const{ return !(r > *this); } bool operator >=(const bign &r)const{ return !(r > *this); } bool operator ==(const bign &r)const{ return !(*this<r)&&!(*this>r); } }; istream & operator >> (istream &in,bign &r){ char s[MAXN]; in>>s; r=s; return in; } ostream & operator <<(ostream &out,const bign &r){ out<<r.tostring(); return out; } int main() { bign a,b; cout<<"随便输入两个数字,要求第一个数字大于第二个数字:"<<endl; while(cin>>a>>b){ cout<<"a*b= "<<a*b<<endl; cout<<"a/b= "<<a/b<<endl; cout<<"a+b= "<<a+b<<endl; cout<<"a-b= "<<a-b<<endl; cout<<"随便输入两个数字,要求第一个数字大于第二个数字:"<<endl; } return 0; }
相关文章推荐
- HDOJ 1950 Bridging signals(LIS)
- 单例
- Python计算机视觉编程练习6:文本、列表操作
- php引入lucene搜索引擎方法.
- 机器学习 --- 入门
- Solr随笔
- LK光流算法:提高计算精度和增加搜索范围
- 多线程中使用Socket Server的问题
- Struts标签里的type属性
- dhcp的基本配置命令
- [转]IO流详解
- MariaDB数据库介绍之四、Galera Cluster
- Objective-C加强-block代码块和protocol协议
- Oracle ORA-06502 数字或值错误:字符串缓冲区太小
- 一步一步制作yaffs/yaffs2根文件系统(二)---安装BusyBox,构造/bin、/sbin、/usr、linuxr
- <编程之美>2.4 1的数目的解释
- 官方的PSNR和SSIM代码
- 我的iOS学习历程 - UITableView(数据model的使用)
- Google推荐的图片加载库Glide介绍
- bzoj1227 [SDOI2009]虔诚的墓主人(组合公式+离散化+线段树)