提交:尚未知道。。= =
困难的A+B
FJ在教奶牛做加法运算!奶牛很聪明,她们很快就厌倦了,于是希望你能帮她们编一个程序应付FJ。FJ每次会给奶牛一张纸,上面分两行写着两个加数,奶牛只要把结果写在另一张纸上就可以了。
输入格式:
Line 1: 加数A
Line 2: 加数B
请注意! 由于奶牛学会了小数运算, 并在FJ前炫耀, 因此FJ会想尽办法刁难奶牛, 但他保证加数的书写合法并且每行不超过250个字符,以免留下不好的名声。输入文件中可能含有无意义的空白字符,你应该忽略它们。
注意有多个减号和加号(遵循正负得正,负负得正)
输出格式:
Line 1: A+B的结果, 你的结果应该以最简洁易懂的形式输出,例如不要有多余的零或其它不必要的字符。
样例
aplusb.in
10000.0
+01
aplusb.out
10001
这道题不用讲了,纯属硬模拟,不过有很多种情况= =
代码↓↓
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
char st[1100];
char s1[1100],s2[1100];
struct node
{
int a[1100],len,slen,xy;
node()
{
len=0;slen=1;
xy=0;
memset(a,0,sizeof(a));
}
}a,b;
int bijiao(node a,node b)
{
if((a.len-a.slen)>(b.len-b.slen)) return -1;
if((a.len-a.slen)<(b.len-b.slen)) return 1;
for(int i=a.len,j=b.len;i>=1&&j>=1;i--,j--)
{
if(a.a[i]>b.a[j]) return -1;
if(a.a[i]<b.a[j]) return 1;
}
if(a.len>b.len) return -1;
if(a.len<b.len) return 1;
return 0;
}
node jiafa(node a,node b)
{
node no;
if(a.slen<b.slen)
{
node t=a;a=b;b=t;
}
no.slen=a.slen;
no.len=no.slen+max((a.len-a.slen),(b.len-b.slen));
int t1=a.slen,t2=b.slen;
for(int i=1;i<=no.slen;i++)
{
if(no.slen-b.slen>=i) no.a[i]=a.a[i];
else no.a[i]=a.a[i]+b.a[i-(no.slen-b.slen)];
}
for(int i=no.slen,j=b.slen;i<=no.len,j<=no.len;i++,j++)
{
no.a[i]=a.a[i]+b.a[j];
}
for(int i=1;i<=no.len;i++)
{
no.a[i+1]+=no.a[i]/10;
no.a[i]%=10;
}
int i=no.len;
while(no.a[i+1]>0)
{
i++;
no.a[i+1]+=no.a[i]/10;
no.a[i]%=10;
}
no.len=i;
while(no.len>0&&no.a[no.len]==0&&no.len-no.slen>=1) no.len--;
int j=1;
while(j<no.slen&&no.a[j]==0)
{
no.slen--;
for(int k=j;k<no.len;k++)
{
no.a[k]=no.a[k+1];
}
no.len--;
}
return no;
}
node jianfa(node a1,node b1)
{
node no;
no.slen=max(a1.slen,b1.slen);
no.len=no.slen+max((a1.len-a1.slen),(b1.len-b1.slen));
if(a1.slen>b1.slen)
{
for(int i=1;i<=a1.slen-b1.slen;i++)
{
no.a[i]=a1.a[i];
}
for(int i=a1.slen-b1.slen+1,j=1;i<=a1.slen,j<=b1.slen;i++,j++)
{
no.a[i]=a1.a[i]-b1.a[j];
}
}
else if(a1.slen==b1.slen)
{
for(int i=1;i<=a1.slen;i++)
{
no.a[i]=a1.a[i]-b1.a[i];
}
}
else
{
for(int i=1;i<=b1.slen-a1.slen;i++)
{
no.a[i]=0-b1.a[i];
}
for(int i=1,j=b1.slen-a1.slen+1;i<a1.slen,j<b1.slen;i++,j++)
{
no.a[j]=a1.a[i]-b1.a[j];
}
}
for(int k=max(a1.slen,b1.slen),i=a1.slen,j=b1.slen;k<=no.len,i<=no.len,j<=no.len;k++,i++,j++)
{
no.a[k]=a1.a[i]-b1.a[j];
}
for(int i=1;i<=no.len;i++)
{
if(no.a[i]<0)
{
no.a[i]+=10;
no.a[i+1]--;
}
}
while(no.len>0&&no.a[no.len]==0&&no.len-no.slen>=1) no.len--;
int j=1;
while(j<no.slen&&no.a[j]==0)
{
no.slen--;
for(int k=j;k<no.len;k++)
{
no.a[k]=no.a[k+1];
}
no.len--;
}
return no;
}
int main()
{
freopen("aplusb.in","r",stdin);
freopen("aplusb.out","w",stdout);
gets(st+1);
int n=0;
int z=0,f=0;
int len=strlen(st+1);
for(int i=1;i<=len;i++) if(st[i]=='-') f++;else if(st[i]=='+') z++;
if(f%2==0||abs(f-z)%2==0)
{
while(st[1]=='+'||st[1]=='-'||st[1]==' ')
{
for(int j=1;j<len;j++)
{
st[j]=st[j+1];
}
len--;
}
}
else
{
while(st[1]=='+'||st[1]=='-'||st[1]==' ')
{
for(int j=1;j<len;j++)
{
st[j]=st[j+1];
}
len--;
}
for(int i=len+1;i>=2;i--) st[i]=st[i-1];
st[1]='-';
len++;
}
for(int i=1;i<=len;i++)
{
if(st[i]=='-'||st[i]=='.') s1[++n]=st[i];
if(st[i]>='0'&&st[i]<='9') s1[++n]=st[i];
}
for(int i=1;i<=n;i++)
{
if(s1[i]=='-') continue;
if(s1[i]=='0'&&s1[i+1]!='.')
{
if(s1[1]!='-') for(int j=1;j<n;j++) s1[j]=s1[j+1];
else for(int j=2;j<n;j++) s1[j]=s1[j+1];
n--;
}
else break;
}
for(int i=n;i>=1;i--)
{
if(s1[i]=='0') n--;
else if(s1[i]=='.')
{
n--;break;
}
else break;
}
gets(st+1);
int m=0;
z=0,f=0;
len=strlen(st+1);
for(int i=1;i<=len;i++) if(st[i]=='-') f++;else if(st[i]=='+') z++;
if(f%2==0||abs(f-z)%2==0)
{
while(st[1]=='+'||st[1]=='-'||st[1]==' ')
{
for(int j=1;j<len;j++)
{
st[j]=st[j+1];
}
len--;
}
}
else
{
while(st[1]=='+'||st[1]=='-'||st[1]==' ')
{
for(int j=1;j<len;j++)
{
st[j]=st[j+1];
}
len--;
}
for(int i=len+1;i>=2;i--) st[i]=st[i-1];
st[1]='-';
len++;
}
for(int i=1;i<=len;i++)
{
if(st[i]=='-'||st[i]=='.') s2[++m]=st[i];
if(st[i]>='0'&&st[i]<='9') s2[++m]=st[i];
}
for(int i=1;i<=m;i++)
{
if(s2[i]=='-') continue;
if(s2[i]=='0'&&s2[i+1]!='.')
{
if(s2[1]!='-') for(int j=1;j<m;j++) s2[j]=s2[j+1];
else for(int j=2;j<m;j++) s2[j]=s2[j+1];
m--;
}
else break;
}
for(int i=m;i>=1;i--)
{
if(s2[i]=='0') m--;
else if(s2[i]=='.')
{
m--;break;
}
else break;
}
for(int i=1;i<=n;i++)
{
if(s1[n-i+1]=='.')
{
a.slen=i;
}
else if(s1[n-i+1]=='-') a.xy=-1;
else a.a[++a.len]=s1[n-i+1]-'0';
}
for(int i=1;i<=m;i++)
{
if(s2[m-i+1]=='.')
{
b.slen=i;
}
else if(s2[m-i+1]=='-') b.xy=-1;
else b.a[++b.len]=s2[m-i+1]-'0';
}
if(a.xy!=b.xy)
{
if(bijiao(a,b)==0)
{
printf("0\n");return 0;
}
if(a.xy==-1)
{
if(bijiao(a,b)==-1)
{
printf("-");
node ans=jianfa(a,b);
for(int i=ans.len;i>=1;i--)
{
if((ans.slen-1)==i) printf(".");
printf("%d",ans.a[i]);
}
printf("\n");
}
else
{
node ans=jianfa(b,a);
for(int i=ans.len;i>=1;i--)
{
if((ans.slen-1)==i) printf(".");
printf("%d",ans.a[i]);
}
printf("\n");
}
}
else
{
if(bijiao(a,b)==1)
{
printf("-");
node ans=jianfa(b,a);
for(int i=ans.len;i>=1;i--)
{
if((ans.slen-1)==i) printf(".");
printf("%d",ans.a[i]);
}
printf("\n");
}
else
{
node ans=jianfa(a,b);
for(int i=ans.len;i>=1;i--)
{
if((ans.slen-1)==i) printf(".");
printf("%d",ans.a[i]);
}
printf("\n");
}
}
}
else
{
node ans=jiafa(a,b);
if(a.xy==-1) printf("-");
for(int i=ans.len;i>=1;i--)
{
if((ans.slen-1)==i) printf(".");
printf("%d",ans.a[i]);
}
printf("\n");
}
return 0;
}