#include <iostream>
#include <cstring>
#include <cstdio>
#define MAX 1300
#define base 10000
#define baselen 4
using namespace std;
//int countnub = 0;
//此大整数类用数组 digital[MAX]表示一个大整数;
//一个 digital表示最大为 9999;
//len 表示目前整数的用到最大digital位,sign表示符号;
class Int
{
public ://构造函数;Int();//比较函数,第二个参数为 0则表示绝对值比较;int cmp(Int  ,int);//判断是否为0;bool zero();//判定奇偶性;bool odd();//右移一个二进制位Int move();//赋值;Int operator = (int);Int operator = (Int );Int operator = (char*);//双目运算;Int operator +(Int );Int operator -(Int );Int operator *(Int );Int operator /(Int );Int operator %(Int );//输入输出;friend ostream& operator <<(ostream&,Int );friend istream& operator >>(istream& ,Int& );
private :int digital[MAX];int sign;int len;//十进制移位Int shift(int k);
};Int ::Int()
{digital[len=0] = 0, sign = 1;
}int Int::cmp(Int obj, int sel = 1)//sel若初始为0是绝对值比较
{if(sel&&obj.sign+sign == 0)return sign - obj.sign;  //比较正负号;int k = len - obj.len;//比较长度;if(k)return sel? sign*k : k;for(k = len; k>0 && obj.digital[k] == digital[k]; k--);  //比较数位;return sel? sign * ( digital[k] - obj.digital[k] ): digital[k]-obj.digital[k];
}bool  Int::zero()
{return digital[0]+len ==0;
}bool  Int:: odd()
{return digital[0]&1;
}Int  Int::move()
{if(digital[0]<=1&&len==0)digital[0] = 0;else{int k = len , t, carry=0;if (digital[len]==1)len--;while(k>=0){t = digital[k]&1;digital[k]= digital[k]>>1;if(carry)digital[k] += base/2;k--;carry = t;}}if(this->zero())sign = 1;return *this;
}
///
Int Int::operator =(Int obj)
{for(len = 0, sign = obj.sign; len <= obj.len; len++)digital[len]=obj.digital[len];len--;return *this;
}
Int Int::operator = (int obj)
{if(obj<0)sign = -1, obj = -obj;else sign = 1;digital[0] = obj%base;if(obj/=base){digital[1] = obj%base, len = 1;if(obj/=base)digital[2] = obj%base, len = 2;}else len = 0;return *this;
}
Int Int::operator =  (char *s)
{int i, j, l, k;if(s[0] == '-')l = 1,sign = -1;else l = 0, sign = 1;i=l;while(s[i])i++;i--;k=0;while(i-baselen+1>=l){for(j=1,digital[k]=0; j<=baselen; j++)digital[k]=digital[k]*10+s[i-baselen+j]-'0';i = i-baselen,k++;}digital[k] = 0;while(i>=l)digital[k] = digital[k]*10 + s[l++] - '0';if(k)len = k-(digital[k]==0);else len = 0;return *this;
}
/
Int Int::operator +(Int obj)
{Int sum;if(obj.sign==sign)   //同号加;{int carry;int i;for(i = carry = 0; i <= len && i <= obj.len; i++)carry  =  carry  + digital[i]  + obj.digital[i],  sum.digital[i]    =  carry%base,carry = carry/base;for(; i <= len; i++)carry  =  carry  +  digital[i],  sum.digital[i]    =  carry%base,  carry  =carry/base;for(; i <= obj.len; i++)carry  =  carry  +obj.digital[i],  sum.digital[i]    =  carry%base,  carry  =carry/base;sum.len = i-!(sum.digital[i] = carry);sum.sign = sign;return sum;}else    //异号变同号减法;{sum = obj;sum.sign = -sum.sign;return *this-sum;}
}
Int  Int::operator -(Int obj)
{Int *sub1, *sub2, quotient;if(sign==obj.sign)   //同号减;{int i, carry;i = this->cmp(obj,0);//绝对值比较;if(i==0)return quotient;else if(i<0)sub1 = &obj, sub2 = this, quotient.sign = -sign;else sub1 = this, sub2 = &obj, quotient.sign = sign;for(i = carry = 0; i <= sub2->len; i++)if(  (quotient.digital[i] = sub1 ->digital[i] - carry - sub2->digital[i]) < 0)carry = 1, quotient.digital[i] += base;//借位;else carry = 0;for(; i <= sub1->len; i++)if(  (quotient.digital[i]  =  sub1  ->digital[i]  -  carry  )<  0  )carry  =  1,quotient.digital[i] += base;//借位;else carry = 0;i--;while(i&"ient.digital[i]==0)i--;quotient.len = i;return quotient;}else      //异号变同号加:{quotient = obj, quotient.sign = -obj.sign;return *this + quotient;}
}
Int Int::operator *(Int obj)
{int carry, i, j, maxlen;Int product;maxlen = obj.len + len + 2;memset( product.digital, 0, sizeof(int)*maxlen );for(i = 0; i <= obj.len; i++){for(j =0, carry = 0; j <= len; j++){carry += obj.digital[i] * digital[j] +product.digital[j+i];product.digital[j+i] = carry%base;carry/=base;}while(carry) product.digital[i+j++] = carry%base, carry /= base;}i = maxlen-1;while(i&&product.digital[i]==0)i--;product.len = i;if(product.zero())product.sign = 1;//确定符号else product.sign = sign*obj.sign;return product;
}
Int Int::operator /( Int obj)
{int div,    k,   flag;Int x, y, z;x = *this;flag = obj.sign*sign;obj.sign = x.sign = 1;while( x.cmp(obj) >0 ){k = x.len-obj.len;if(  x.digital[x.len]  >  obj.digital[obj.len]  )  div  =x.digital[x.len]/(obj.digital[obj.len]+1);else  if(x.len>obj.len)k--,  div  =(x.digital[x.len]*base+x.digital[x.len-1])/(obj.digital[obj.len]+1);else break;x = x - ( obj*(z=div) ).shift(k);y = y+ z.shift(k);}if(x.cmp(obj)>=0)y = y+(z=1);if(y.zero())y.sign=1;else y.sign=flag;return y;
}
Int Int::operator %(Int obj)
{int div,   k;Int x, y, z;x = *this;obj.sign = x.sign = 1;while( x.cmp(obj) >0 ){k = x.len-obj.len;if(  x.digital[x.len]  >  obj.digital[obj.len]  )  div  =x.digital[x.len]/(obj.digital[obj.len]+1);else  if(x.len>obj.len)k--,  div  =(x.digital[x.len]*base+x.digital[x.len-1])/(obj.digital[obj.len]+1);else break;x = x - ( obj*(z=div) ).shift(k);}if(x.cmp(obj)>=0)x = x-obj;if(x.zero())x.sign = 1;else x.sign = sign;return x;
}
Int Int::shift(int k)
{Int temp;int i;temp = *this;for(i=0; i<=len; i++)temp.digital[i+k]=digital[i];for(i=0; i<k; i++)temp.digital[i] = 0;temp.sign = sign;temp.len = len+k;return temp;
}
///
ostream& operator <<(ostream& out,Int obj )
{int i = obj.len;if(obj.sign==-1)out<<'-';out<<obj.digital[i--];out.fill('0');out.setf(ios::right);while(i>=0){out.width(baselen);out<<obj.digital[i--];}return out;
}
istream& operator >>(istream& in,Int& obj)
{char s[baselen*MAX];in>>s;obj = s;return in;
}
int main()
{Int a, b;while(cin >> a >> b){cout << a+b << endl;cout << a-b << endl;cout << a*b << endl;cout << a/b << endl;}return 0;
}

大数模板——来自jxy师兄相关推荐

  1. c++ 大数类 大数模板

    分别使用C++中的运算符重载的方法来实现大数之间的数学运算,包括加法.减法.乘法.除法.n次方.取模.大小比较.赋值以及输入流.输出流的重载.. 并且使用这个大数模板,顺利AC了HDOJ上的1134这 ...

  2. hdu 1134 卡特兰数(大数模板)

    卡特兰数 递推公式: C(n)=C(2n,n)/(n+1)  即用数组表示为c[i]=c[i-1]*(4*i-2)/(i+1); 一般形式 直接 表达 c[1]=1; for(i=2;i<40; ...

  3. 高精度运算模板(大数模板)

    现在还没学java..所以没法用java偷懒,先存一波C加加的大数运算模板,以备不时之需 补充:关于base参数的使用:代表字符串a和b都是在base进制下的数字,转换成10进制后进行运算后,返回的答 ...

  4. 大数模板(加减乘除幂次开方)

    很好用的模板,但当时做题的时候从哪里找的不知道了,原作看到知会我一声我补上hhh 1 struct BigInteger 2 { 3 int len; 4 int arg[500]; 5 BigInt ...

  5. hdu-1041(大数模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1041 题意:电脑中存在数字1,进行扩展操作,如果遇到1变为"01",如果遇到0,变 ...

  6. kuangbin大数模板(加法和乘法)

    之前的模板因为用了string类,以及运算的时候常数太大,导致速度太慢,虽然比较方便但不算很通用,所以存一波kuangbin大大的模板 /** 高精度,支持乘法和加法*/ struct BigInt ...

  7. java大数模板_java大数模板

    这几天做了几道用大数的题,发现java来做大数运算十分方便.对acmer来说是十分实用的 1.valueOf(parament); 将参数转换为制定的类型 比如 int a=3; BigInteger ...

  8. 来自学长师兄们的应届校招经验

    part1 记得三月的第一个星期五吧,小操场打球,偶遇一位研三师兄,就主动跟师兄聊起了校招求职.很高兴,能遇到一位愿意跟你分享他自己求职经验的师兄,师兄也很热情,我们聊了好多.下面,开始敲黑板. 1) ...

  9. 矩形面积和矩形周长并的模板——来自notonlysuccess

    矩形面积并 hdu1542 Atlantis 题意:矩形面积并 思路:浮点数先要离散化;然后把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用cnt表示该区间下边比上边多几个,sum代 ...

最新文章

  1. Citrix VDI实战攻略之五:vDisk配置
  2. 面向对象技术-设计模式的图
  3. SAP Spartacus 如何连接到其他系统
  4. Remoting-1
  5. 未来码农或可以备份一个自己的大脑
  6. idea退出首界面_如何取消Idea开始界面打开默认项目配置
  7. 机房收费管理系统 之 总结
  8. 深入浅出Flex组件生命周期Part4 ─ 引擎LayoutManager【转载】
  9. 部门经常加班,该怎么办
  10. html tab标签_如何用HTML写一个网页
  11. 阿里云 蚂蚁支付宝 钉钉 c++ 面经
  12. 家谱制作软件如何成谱编修流程
  13. 吴裕雄--天生自然 诗经:琵琶行
  14. todo有android版本吗,高效todo手机app下载
  15. cie1931 python绘制_科学网—gnuplot与CIE1931 XYZ三刺激值曲线 - 范学良的博文
  16. 超市管理系统Java
  17. SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length关于edittext找不到输入值这个
  18. 【更新】Kendo UI for jQuery发布R2 2018|附下载
  19. 职场规则分享,别说你不知道这3个潜规则
  20. matlab给图像加网格,matlab把图像进行网格化,或者是在图像中画网格

热门文章

  1. ubuntu网站及数据库自动备份
  2. dorado 刷新_记录新建dorado项目更新规则中报错
  3. ios播放器相关(音乐列表获取)
  4. localhost,127.0.0.1,本机IP
  5. receptive field,即感受野
  6. PL/SQL教程:PL/SQL Developer使用技巧
  7. Manjaro安装pscs6菜单栏无法显示中文,提示‘$$/ADMDialog/iFontProblemWarning=The Adobe UI font could not be loaded.’
  8. 程序员代码对比工具,就用这7个
  9. ANSYS workbench数值分析 新手教程(1)
  10. 基金投资入门3:中外常见金融指数类型说明