记录编号 |
474774 |
评测结果 |
AAAAAAAAAA |
题目名称 |
增强的加法问题 |
最终得分 |
100 |
用户昵称 |
Arrow |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.061 s |
提交时间 |
2017-11-10 20:45:56 |
内存使用 |
0.25 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <queue>
using namespace std;
#define MAXN 100010
#define INF 0x7fffffff
const int MOD=10000;
struct Great_int
{
int num[110];
int len;
string s;
bool po_ne;
Great_int(void)
{
memset(num,0,sizeof(num));
len=0;
po_ne=1;
s.clear();
}
void transform(void)
{
int j=0,i;
if(s.length()==2)
num[j]=(s[0]-'0')*10+s[1]-'0',j++;
else
if(s.length()==1)
num[j]=s[0]-'0',j++;
else
{
for(i=s.length()-1;i>=3;i-=4)
num[j]=(s[i-3]-'0')*1000+(s[i-2]-'0')*100+(s[i-1]-'0')*10+s[i]-'0',j++;
if(i==2)
num[j]=(s[0]-'0')*100+(s[1]-'0')*10+(s[2]-'0'),j++;
else
if(i==1)
num[j]=(s[0]-'0')*10+(s[1]-'0'),j++;
else
if(i==0)
num[j]=(s[0]-'0'),j++;
len=j-1;
}
}
void print(void)
{
if(!po_ne)
printf("-");
printf("%d",num[len]);
for(int i=len-1;i>=0;i--)
printf("%04d",num[i]);
}
};
Great_int operator + (Great_int x,Great_int y)
{
Great_int rel;
int j=max(x.len,y.len);
for(int i=0;i<=j;i++)
{
rel.num[i]+=(x.num[i]+y.num[i]);
if(rel.num[i]>=MOD)
rel.num[i+1]+=rel.num[i]/MOD,rel.num[i]%=MOD;
}
rel.len= rel.num[j+1]==0 ? j : j+1;
return rel;
}
Great_int operator - (Great_int x,Great_int y) // x - y
{
Great_int rel;
bool flag=0;
int j=x.len;
if(x.len<y.len)
j=y.len,flag=1;
if(!flag&&x.len==y.len)
for(int i=0;i<=j;i++)
if(y.num[i]>x.num[i])
{
flag=1;
break;
}
if(flag)
{
int tmp[110];
memcpy(tmp,x.num,sizeof(x.num));
memcpy(x.num,y.num,sizeof(y.num));
memcpy(y.num,tmp,sizeof(tmp));
}
for(int i=0;i<=j;i++)
{
if(x.num[i]<y.num[i])
x.num[i+1]-=1,x.num[i]+=MOD;
rel.num[i]=x.num[i]-y.num[i];
}
while(!rel.num[j])
j--;
rel.len=j;
if(flag)
rel.po_ne=0;
return rel;
}
Great_int operator *(Great_int x,Great_int y)
{
Great_int rel;
int k;
for(int i=0;i<=x.len;i++)
{
k=i;
for(int j=0;j<=y.len;j++,k++)
{
rel.num[k]+=x.num[i]*y.num[j];
if(rel.num[k]>=MOD)
rel.num[k+1]+=rel.num[k]/MOD,rel.num[k]%=MOD;
}
}
while(!rel.num[k])
k--;
rel.len=k;
return rel;
}
/*
void work_1()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%c;
b>>=1;
a=(a*a)%c;
}
printf("%d\n",ans);
}
*/
void work_2()
{
Great_int x,y;
cin>>x.s>>y.s;
x.transform();//cout<<x.num[0]<<' '<<x.num[1]<<' '<<x.num[2]<<endl;
y.transform();//cout<<y.num[0]<<' '<<y.num[1]<<' '<<y.num[2]<<endl;
Great_int ans;
ans=x+y;
ans.print();
printf("\n");
/*ans=x-y;
ans.print();
printf("\n");
ans=x*y;
ans.print();
printf("\n");*/
}
/*
int gcd(int a,int b)
{
return b==0 ? a : gcd(b,a%b);
}
void work_3()
{
int a,b;
scanf("%d%d",&a,&b);
int d=gcd(a,b);
printf("%d\n",d);
}
struct Edge{ int to,nex,w;
bool operator <(const Edge &x)const
{
return w>x.w;
}
}edges[MAXN];
int head[MAXN],cnt=0,dis[MAXN];
void addedges(int u,int v,int c)
{
edges[cnt]=(Edge){v,head[u],c},head[u]=cnt++;
edges[cnt]=(Edge){u,head[v],c},head[v]=cnt++;
}
void work_4()
{
int n,m,num=0,ans=0;
//bool in_mst[MAXN];
scanf("%d%d",&n,&m);
cnt=0;
memset(head,-1,sizeof(head));
for(int i=1;i<=m;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
addedges(u,v,c);
}
priority_queue <Edge> Q;
for(int i=2;i<=n;i++)
dis[i]=INF;
dis[1]=0;
for(int i=head[1];i!=-1;i=edges[i].nex)
Q.push(edges[i]),dis[edges[i].to]=edges[i].w;
// in_mst[1]=1;
while(num<n-1)
{
Edge e=Q.top();Q.pop();
if(dis[e.to]<e.w)
continue;
ans+=e.w;
dis[e.to]=0;
num++;
for(int i=head[e.to];i!=-1;i=edges[i].nex)
{
Edge tmp=edges[i];
if(dis[tmp.to]>tmp.w)
{
dis[tmp.to]=tmp.w;
Q.push(tmp);
}
}
}
printf("%d\n",ans);
}
void work_5()
{
int n,m;
cnt=0;
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
for(int i=1;i<=m;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
addedges(u,v,c);
}
priority_queue <Edge> Q;
for(int i=2;i<=n;i++)
dis[i]=INF;
dis[1]=0;
Q.push((Edge){1,-1,dis[1]});
while(!Q.empty())
{
Edge e=Q.top();Q.pop();
if(dis[e.to]<e.w)
continue;
for(int i=head[e.to];i!=-1;i=edges[i].nex)
{
Edge tmp=edges[i];
if(dis[tmp.to]>e.w+tmp.w)
{
dis[tmp.to]=e.w+tmp.w;
Q.push((Edge){tmp.to,-1,dis[tmp.to]});
}
}
}
for(int i=2;i<=n;i++)
printf("%d ",dis[i]);
}
*/
int main()
{
freopen("add.in","r",stdin);
freopen("add.out","w",stdout);
/*int type;
scanf("%d",&type);
if(type==1)
work_1();
if(type==2)
work_2();
if(type==3)
work_3();
if(type==4)
work_4();
if(type==5)
work_5();*/
work_2();
return 0;
}