2738:实数加法

来源:互联网 发布:360智能路由器软件 编辑:程序博客网 时间:2024/04/29 06:04



2738:实数加法


  • 提交


  • 统计


  • 提示


  • 提问


    总时间限制:
    1000ms
    内存限制:
    65536kB
    描述

    求两个实数相加的和。

    题目中输入输出里出现的浮点数都有如下的形式:
    P1P2...Pi.Q1Q2...Qj。对于整数部分,P1P2...Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。

    输入
    2行,每行是一个加数。每个加数的长度不超过100。
    输出
    一行,即相应的和。输出保证一定是一个小数部分不为0的实数。
    样例输入
    0.1111111111111111111111111111110.111111111111111111111111111111
    样例输出
    0.222222222222222222222222222222


    大致记录下解题思路,可能有点笨拙,首先是通过小数点将字符串分为两部分,一个小数部分ah,bh,一个数整数部分,af,bf,然后写一个逆序函数,因为字符串表示的树最高位是在a[0],b[0],我们模拟加法时,一旦出现进位,这时候处理最高位很麻烦,所以将其逆序,比如:456-》654,789-》987,处理·987+654相加比处理,456+789方便的多,如果出现进位,我们往数组的后一位继续加即可,得到的结果是两个字符串相加结果的逆序数,将逆序结果逆序过来后,就是正确的结果,写一个大数相加函数。在写一个除去小数部分相加结果末尾处多余0的函数,最后在输出时printf("%s.%s\n",add1,add2);(此处注意一点,这个bug坑了半天,就是for循环中,循环变量i,j的值,及时定义在循环体外部,出了循环体后,i,j的值会更新为0或者1,所以我们需要一个max0变量记录下来两数相加后最大的位数);

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    #define N 110
    void ni(char a[])
    {
        int len=strlen(a);
        char b[N];
        for(int i=0;i<len;i++)
            b[i]=a[i];
        for(int i=0;i<len;i++)
            a[i]=b[len-1-i];
    }
    int flag=0;
    void add(char a[],char b[])
    {
         ni(a);
         ni(b);
        int lena=strlen(a),lenb=strlen(b),i,j;
        for(i=0;i<lena&&i<lenb;i++){
            int t=a[i]-'0'+b[i]-'0'+flag;
            a[i]=t%10+'0';
            flag=t/10;
        }
        int max0=i;
        for(j=i;j<lena;++j){
            int t=a[j]-'0'+flag;
            a[j]=t%10+'0';
            flag=t/10;
            max0=j+1;
        }
        for(j=i;j<lenb;++j){
            int t=b[j]-'0'+flag;
            a[j]=t%10+'0';
            flag=t/10;
            max0=j+1;
        }
        if(flag==1)
        {
            a[max0]='1';
            a[max0+1]='\0';
        }
        else
            a[max0]='\0';
    }
    void qu(char a[])
    {
        int len=strlen(a);
        int i=0;
        while(a[i]=='0'){
            i++;
        }
        for(int j=0;j<len-i;j++){
            a[j]=a[j+i];
        }
        a[len-i]='\0';
    }
    int main()
    {
        char a[N],b[N];
       while(scanf("%s %s",a,b)!=EOF){
        int lena=strlen(a),lenb=strlen(b);
        char af[N],ah[N],bf[N],bh[N];
        int i,j;
        for(i=0;i<lena;i++)
        {
             if(a[i]=='.')
                break;
             af[i]=a[i];
        }
        af[i]='\0';
        for(j=i+1;j<lena;j++){
            ah[j-i-1]=a[j];
        }
        ah[j-i-1]='\0';
        for(i=0;i<lenb;i++)
        {
             if(b[i]=='.')
                break;
             bf[i]=b[i];
        }
        bf[i]='\0';
        for(j=i+1;j<lenb;j++){
            bh[j-i-1]=b[j];
        }
        bh[j-i-1]='\0';
        int lenah=strlen(ah),lenbh=strlen(bh),maxlen=lenah;
        if(lenah<lenbh){
            for(int i=lenah;i<lenbh;i++){
                ah[i]='0';
            }
            ah[lenbh]='\0';
            maxlen=lenbh;
        }
        else if(lenah>lenbh){
            for(int i=lenbh;i<lenah;i++){
                bh[i]='0';
            }
            bh[lenah]='\0';
        }
       add(ah,bh);
        ah[maxlen]='\0';
        qu(ah);
        ni(ah);
       add(af,bf);
       ni(af);
       int lenaaf=strlen(af);
       printf("%s.%s\n",af,ah);}
       return 0;
    }

  • 0 0
    原创粉丝点击