记录编号 |
338797 |
评测结果 |
AAAAAAAAAA |
题目名称 |
增强的加法问题 |
最终得分 |
100 |
用户昵称 |
Hzoi_Go灬Fire |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.013 s |
提交时间 |
2016-11-05 15:41:17 |
内存使用 |
0.32 MiB |
显示代码纯文本
/*
加减乘除取模开根 康哥手写 大整数封装
*/
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<stack>
#include<cstdio>
using namespace std;
#define LL long long
#define Begin freopen("add.in","r",stdin);freopen("add.out","w",stdout);
#define End fclose(stdin);fclose(stdout);
const LL maxn=10101;
struct Bigint{
LL a[maxn];
void Print(){//输出
for(LL i=a[0];i>=1;i--)printf("%lld",a[i]);
puts("");
}
void Init(string s){//赋值
memset(a,0,sizeof(a));
a[0]=s.size();
for(LL i=1;i<=a[0];i++)a[i]=s[a[0]-i]-'0';
while(a[0]>1 && a[a[0]]==0)a[0]--;
}
Bigint operator + (const Bigint & b)const{//高精加高精
Bigint c;memset(c.a,0,sizeof(c.a));
c.a[0]=max(a[0],b.a[0]);
for(LL i=1;i<=c.a[0];i++){
c.a[i]+=a[i]+b.a[i];
if(c.a[i]>9){
c.a[i+1]++;
c.a[i]-=10;
}
}
if(c.a[c.a[0]+1])c.a[0]++;
return c;
}
Bigint operator - (const Bigint & b)const{//高精减高精
Bigint c;memset(c.a,0,sizeof(c.a));
c.a[0]=max(a[0],b.a[0]);
for(LL i=1;i<=c.a[0];i++){
c.a[i]+=a[i]-b.a[i];
if(c.a[i]<0){
c.a[i+1]--;
c.a[i]+=10;
}
}
while(c.a[0]>1 && c.a[c.a[0]]==0)c.a[0]--;
return c;
}
Bigint operator * (const Bigint & b)const{//高精乘高精
Bigint c;memset(c.a,0,sizeof(c.a));
c.a[0]=a[0]+b.a[0]-1;
for(LL i=1;i<=a[0];i++){
for(LL j=1;j<=b.a[0];j++){
c.a[i+j-1]+=a[i]*b.a[j];
if(c.a[i+j-1]>9){
c.a[i+j]+=c.a[i+j-1]/10;
c.a[i+j-1]%=10;
}
}
}
if(c.a[c.a[0]+1])c.a[0]++;
while(c.a[0]>1 && c.a[c.a[0]]==0)c.a[0]--;
return c;
}
bool operator < (const Bigint & b)const{//重载小于号
if(a[0]<b.a[0])return true;
if(a[0]>b.a[0])return false;
for(LL i=a[0];i;i--){
if(a[i]>b.a[i])return false;
if(a[i]<b.a[i])return true;
}
return false;
}
bool operator == (const Bigint & b)const{//重载等于号
if(a[0]^b.a[0])return false;
for(LL i=a[0];i;i--)if(a[i]^b.a[i])return false;
return true;
}
bool operator > (const Bigint & b)const{//重载大于号
if(a[0]<b.a[0])return false;
if(a[0]>b.a[0])return true;
for(LL i=a[0];i;i--){
if(a[i]>b.a[i])return true;
if(a[i]<b.a[i])return false;
}
return false;
}
Bigint operator / (const LL & temp)const{//高精除低精
Bigint b; memset(b.a,0,sizeof(b.a));
b.a[0]=a[0];
LL x=0;
for(LL i=a[0];i>=1;i--){
b.a[i]=(x*10+a[i])/temp;
x=(x*10+a[i])%temp;
}
while(b.a[0]>1 && b.a[b.a[0]]==0)b.a[0]--;
return b;
}
Bigint operator * (const LL & temp)const{//高精乘低精
Bigint b;memset(b.a,0,sizeof(b.a));
b.a[0]=a[0];
for(LL i=1;i<=a[0];i++)b.a[i]=a[i]*temp;
for(LL i=1;i<=b.a[0];i++){
if(b.a[i]>9){
b.a[i+1]+=b.a[i]/10;
b.a[i]%=10;
if(i==b.a[0])b.a[0]++;
}
}
while(b.a[0]>1 && b.a[b.a[0]]==0)b.a[0]--;
return b;
}
LL operator % (const LL & temp)const{//高精模低精
LL date=0;
for(LL i=a[0];i>=1;i--){
date=date*10+a[i];
date%=temp;
}
return date;
}
};
Bigint numcpy(const Bigint p,LL pos){//从pos开始的地方复制p数组到q数组
Bigint a;memset(a.a,0,sizeof(a.a));
for(LL i=1;i<=p.a[0];i++)a.a[i+pos-1]=p.a[i];
a.a[0]=p.a[0]+pos-1;
return a;
}
Bigint operator / (Bigint & a,Bigint & b){//高精除高精
Bigint c;memset(c.a,0,sizeof(c.a));
if(a==b){c.Init("1");return c;}
if(a<b){c.Init("0");return c;}
c.a[0]=a.a[0]-b.a[0]+1;
for(LL i=c.a[0];i>0;i--){
Bigint temp=numcpy(b,i);
while(a>temp || a==temp){c.a[i]++;a=a-temp;}
}
while(c.a[0]>1 && c.a[c.a[0]]==0)c.a[0]--;
return c;
}
Bigint operator % (Bigint & a,Bigint & b){//高精模高精
Bigint c;memset(c.a,0,sizeof(c.a));
if(a==b){c.Init("0");return c;}
if(a<b)return a;
c.a[0]=a.a[0]-b.a[0]+1;
for(LL i=c.a[0];i>0;i--){
Bigint temp=numcpy(b,i);
while(a>temp || a==temp){
c.a[i]++;
a=a-temp;
}
}
return a;
}
Bigint qpow(Bigint a,int k){//高精快速幂
Bigint ans;ans.Init("1");
while(k){
if(k&1)ans=ans*a;
a=a*a;k>>=1;
}
return ans;
}
void Init();
int main(){
Begin;
Init();
getchar();getchar();
End;
return 0;
}
void Init(){
Bigint a,b;string s1,s2;;cin>>s1>>s2;
a.Init(s1);b.Init(s2);a=a+b;a.Print();
//-----------大整数开方--------//
/*Bigint a,l,r,yi;
string s;cin>>s;
a.Init(s);
l.Init("0");r.Init(s);yi.Init("1");
while(l<r || l==r){
Bigint mid=l+r;mid=mid/2;
Bigint ans;ans=mid*mid;
if(ans==a){mid.Print();return;}
if(ans<a)l=mid+yi;
else r=mid-yi;
}
r.Print(); */
//----------高精乘高精-------------//
/*Bigint a,b;string s1,s2;cin>>s1>>s2;
a.Init(s1);b.Init(s2);a=a*b;a.Print(); */
//----------高精乘低精-----------//
/*Bigint a;string s;LL x;cin>>s>>x;
a.Init(s);a=a*x;a.Print();*/
//----------高精除高精-------------//
/*Bigint a,b;string s1,s2;cin>>s1>>s2;
a.Init(s1);b.Init(s2);a=a/b;a.Print(); */
//----------高精除低精-----------//
/*Bigint a;string s;LL x;cin>>s>>x;
a.Init(s); a=a/x;a.Print();*/
//----------高精模高精-------------//
/*Bigint a,b;string s1,s2;cin>>s1>>s2;
a.Init(s1);b.Init(s2);a=a%b;a.Print(); */
//----------高精模低精-----------//
/*Bigint a;string s;LL x;cin>>s>>x;
a.Init(s); LL ans=a%x;printf("%lld\n",ans);*/
//----------高精减高精----------//
/*Bigint a,b;string s1,s2;cin>>s1>>s2;
a.Init(s1);b.Init(s2);
if(a>b || a==b){a=a-b;a.Print();}
else {a=b-a;printf("-");a.Print();}*/
//----------高精加高精----------//
/*Bigint a,b;string s1,s2;;cin>>s1>>s2;
a.Init(s1);b.Init(s2);a=a+b;a.Print();*/
}