大数模板
来源:互联网 发布:图像扫描列数据 编辑:程序博客网 时间:2024/05/20 00:13
数字不会超大的情况下可以用
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <algorithm>#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)using namespace std;struct huge{ #define N_huge 850 #define base 100000000 static char s[N_huge*10]; typedef long long value; value a[N_huge];int len; void clear(){len=1;a[len]=0;} huge(){clear();} huge(value x){*this=x;} huge operator =(huge b){ len=b.len;for (int i=1;i<=len;++i)a[i]=b.a[i]; return *this; } huge operator +(huge b){ int L=len>b.len?len:b.len;huge tmp; for (int i=1;i<=L+1;++i)tmp.a[i]=0; for (int i=1;i<=L;++i){ if (i>len)tmp.a[i]+=b.a[i]; else if (i>b.len)tmp.a[i]+=a[i]; else { tmp.a[i]+=a[i]+b.a[i]; if (tmp.a[i]>=base){ tmp.a[i]-=base;++tmp.a[i+1]; } } } if (tmp.a[L+1])tmp.len=L+1; else tmp.len=L; return tmp; } huge operator -(huge b){ int L=len>b.len?len:b.len;huge tmp; for (int i=1;i<=L+1;++i)tmp.a[i]=0; for (int i=1;i<=L;++i){ if (i>b.len)b.a[i]=0; tmp.a[i]+=a[i]-b.a[i]; if (tmp.a[i]<0){ tmp.a[i]+=base;--tmp.a[i+1]; } } while (L>1&&!tmp.a[L])--L; tmp.len=L; return tmp; } huge operator *(huge b){ int L=len+b.len;huge tmp; for (int i=1;i<=L;++i)tmp.a[i]=0; for (int i=1;i<=len;++i) for (int j=1;j<=b.len;++j){ tmp.a[i+j-1]+=a[i]*b.a[j]; if (tmp.a[i+j-1]>=base){ tmp.a[i+j]+=tmp.a[i+j-1]/base; tmp.a[i+j-1]%=base; } } tmp.len=len+b.len; while (tmp.len>1&&!tmp.a[tmp.len])--tmp.len; return tmp; } pair<huge,huge> divide(huge a,huge b){ int L=a.len;huge c,d; for (int i=L;i;--i){ c.a[i]=0;d=d*base;d.a[1]=a.a[i]; //while (d>=b){d-=b;++c.a[i];} int l=0,r=base-1,mid; while (l<r){ mid=(l+r+1)>>1; if (b*mid<=d)l=mid; else r=mid-1; } c.a[i]=l;d-=b*l; } while (L>1&&!c.a[L])--L;c.len=L; return make_pair(c,d); } huge operator /(value x){ value d=0;huge tmp; for (int i=len;i;--i){ d=d*base+a[i]; tmp.a[i]=d/x;d%=x; } tmp.len=len; while (tmp.len>1&&!tmp.a[tmp.len])--tmp.len; return tmp; } value operator %(value x){ value d=0; for (int i=len;i;--i)d=(d*base+a[i])%x; return d; } huge operator /(huge b){return divide(*this,b).first;} huge operator %(huge b){return divide(*this,b).second;} huge &operator +=(huge b){*this=*this+b;return *this;} huge &operator -=(huge b){*this=*this-b;return *this;} huge &operator *=(huge b){*this=*this*b;return *this;} huge &operator ++(){huge T;T=1;*this=*this+T;return *this;} huge &operator --(){huge T;T=1;*this=*this-T;return *this;} huge operator ++(int){huge T,tmp=*this;T=1;*this=*this+T;return tmp;} huge operator --(int){huge T,tmp=*this;T=1;*this=*this-T;return tmp;} huge operator +(value x){huge T;T=x;return *this+T;} huge operator -(value x){huge T;T=x;return *this-T;} huge operator *(value x){huge T;T=x;return *this*T;} //huge operator /(value x){huge T;T=x;return *this/T;} //huge operator %(value x){huge T;T=x;return *this%T;} huge operator *=(value x){*this=*this*x;return *this;} huge operator +=(value x){*this=*this+x;return *this;} huge operator -=(value x){*this=*this-x;return *this;} huge operator /=(value x){*this=*this/x;return *this;} huge operator %=(value x){*this=*this%x;return *this;} bool operator ==(value x){huge T;T=x;return *this==T;} bool operator !=(value x){huge T;T=x;return *this!=T;} bool operator <=(value x){huge T;T=x;return *this<=T;} bool operator >=(value x){huge T;T=x;return *this>=T;} bool operator <(value x){huge T;T=x;return *this<T;} bool operator >(value x){huge T;T=x;return *this>T;} huge operator =(value x){ len=0; while (x)a[++len]=x%base,x/=base; if (!len)a[++len]=0; return *this; } bool operator <(huge b){ if (len<b.len)return 1; if (len>b.len)return 0; for (int i=len;i;--i){ if (a[i]<b.a[i])return 1; if (a[i]>b.a[i])return 0; } return 0; } bool operator ==(huge b){ if (len!=b.len)return 0; for (int i=len;i;--i) if (a[i]!=b.a[i])return 0; return 1; } bool operator !=(huge b){return !(*this==b);} bool operator >(huge b){return !(*this<b||*this==b);} bool operator <=(huge b){return (*this<b)||(*this==b);} bool operator >=(huge b){return (*this>b)||(*this==b);} huge str(char s[]){ int l=strlen(s);value x=0,y=1;len=0; for (int i=l-1;i>=0;--i){ x=x+(s[i]-'0')*y;y*=10; if (y==base)a[++len]=x,x=0,y=1; } if (!len||x)a[++len]=x; } void read(){ scanf("%s",s);this->str(s); } void print(){ printf("%d",(int)a[len]); for (int i=len-1;i;--i){ for (int j=base/10;j>=10;j/=10){ if (a[i]<j)printf("0"); else break; } printf("%d",(int)a[i]); } printf("\n"); }}f[3];char huge::s[N_huge*10];int main(){ f[0].read();f[1].read(); f[2]=f[0]+f[1]; f[2].print(); } return 0;}
0 0
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数 模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- 大数模板
- Android Studio系列教程五--Gradle命令详解与导入第三方包
- 06-js禁止回车提交表单
- VS2013编译安装VTK-6.2.0_支持Qt5.4.2
- poj解题报告——2234
- 二三四五六章作业
- 大数模板
- hulu面试经验
- 南邮 OJ 1127 Stick
- 函数闭包问题的学习
- Groovy
- linux下fastboot烧录的方法
- 南邮 OJ 1128 An Industrial Spy
- 在ubuntu12.04中安装wine和sourceinsight
- c++中堆、栈内存分配