困难的A+B

提交:尚未知道。。= =

困难的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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值