大整数的四则运算
来源:互联网 发布:office2010解密软件 编辑:程序博客网 时间:2024/04/29 18:36
大整数的四则运算经常用到,有必要专门写一个数据结构当以后用到的时候可以直接使用,原理就是四则运算的笔算,但是写起来细节还是挺多的,虽然并不是很完善,但是一般用来应该足够了
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define MAXN 1000using 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;}
0 0
- 大整数的四则运算
- 大整数的四则运算
- 大整数的四则运算
- 比较好的大整数四则运算
- [程序设计实习]大整数的四则运算
- java实现大整数的四则运算
- 大整数类的四则运算和逻辑运算
- 大整数四则运算
- 大整数四则运算
- 大整数四则运算
- C语言-大整数四则运算
- 大整数的四则运算代码(供新手学习…
- 思路简单做起来容易出错的大整数四则运算
- C++实现高精度大整数(大数)的四则运算
- 高精度整数的四则运算
- 数据结构课设之大整数四则运算
- c++ 程序设计 wee4 作业 大整数四则运算
- 大数据的四则运算
- php引入lucene搜索引擎方法.
- 单例
- Python计算机视觉编程练习6:文本、列表操作
- java基础之异常
- windows10打不开nginx应该怎么办?
- 大整数的四则运算
- 初入IT
- 一步一步制作yaffs/yaffs2根文件系统(三)---使用glibc库构造 /lib
- 数据库连接池理论研究总结
- Myeclipse下tomcat报错publishing to tomcat.......
- 维度模型数据仓库(十九) —— 维度合并
- linux命令,一天敲3个
- HackTheGame
- ASP.NET-MVC4-06-ViewData-ViewBag