• 大数的加法


    【题目介绍】  

      大数的加法,一般的处理方法都是用字符串操作,今天来处理带小数的大数加法。

      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1753

    【解题思路】

      纯粹的字符串操作。重要的是要找到小数点的位置,然后以小数点为分割,将字符串分为整数部分和小数部分。然后两部分分别求和,最后再组合成一个串。

      第一步:找小数点的位置。

          可以用循环搞定,记录下小数点的位置x;注意:如果两个数中有整数,整数的小数点在哪儿呢,在下标=-1处^_^;

      第二步:求小数部分的和。

          首先要把小数部分分离出来,小数点的位置x就起作用了,把下标大于x且小于字符串a的长度的部分保存在a1里;字符串b同理。

          然后a1加b1;

          注意:小数部分保存后第一位是要对齐的,

          例:

            .234

            .23456

          长度不一样时,对短的是要在后面补字符‘0’。

          小数部分和sum1,不要进位,但要保存是否进位的信息。

      第三步:求整数部分和。

          和第二步类似,不细说了。

          但要注意的是:整数部分是要最后一位对齐的,

          例:

            1234.

              45.

          长度不一样时,要在短的字符前面补字符‘0’。

          记整数部分和sum2,这个有进位。

      第四步:求和。

          如果sum1有进位,那么,sum2和字符‘1’再做有进位的加法

      第五步:按要求输出

    【代码】

    #include <iostream>
    #include <cstring>
    #include <string>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    int t;
    string add1(string a,string b)  //小数部分求和函数
    {
        //给不足位的串在后面补‘0’
        if(a.length()>b.length())
            b=b+string(a.length()-b.length(),'0');
        else
            a=a+string(b.length()-a.length(),'0');
    
        t=0;    //进位标志
        for(int i=a.length()-1;i>=0;--i)
        {
            t+=a[i]-'0'+b[i]-'0';
            a[i]=t%10+'0';
            t/=10;
        }
    
     return a;
    }
    
    string add2(string a,string b)  //整数部分求和函数
    {
        //给不足位的串在前面补‘0’
        if(a.length()>b.length())
            b=string(a.length()-b.length(),'0')+b;
        else
            a=string(b.length()-a.length(),'0')+a;
    
        int f=0;    //进位标志
        for(int i=a.length()-1;i>=0;--i)
        {
            f+=a[i]-'0'+b[i]-'0';
            a[i]=f%10+'0';
            f/=10;
        }
       return (f?'1'+a:a);
    }
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        string a,b;
    
        while(cin>>a>>b)
        {
            //a,b长度
            int lena = a.length();
            int lenb = b.length();
            //找小数点位置
            int x=-1;
            int y=-1;
            for(int i=0;i<lena;i++)
                if(a[i]=='.')
                    x=i;
            for(int i=0;i<lenb;i++)
                if(b[i]=='.')
                    y=i;
            //小数部分加法
            char a1[405]={'0'},b1[405]={'0'};
            if(x!=-1)
                for(int i=0;i<lena;i++)
                {
                    a1[i]=a[++x];
                }
            if(y!=-1)
                for(int i=0;i<lenb;i++)
                {
                    b1[i]=b[++y];
                }
            string sum1=add1(a1,b1);
            //整数部分加法
            char a2[405]={'0'},b2[405]={'0'};
            for(int i=0;i<lena;i++)
            {
                if(a[i]=='.')
                    break;
                a2[i]=a[i];
            }
            for(int i=0;i<lenb;i++)
            {
                if(b[i]=='.')
                    break;
                b2[i]=b[i];
            }
            string sum2=add2(a2,b2);
            //输出
            if(t==1)
                sum2=add2(sum2,"1");    //判断sum1是否有进位
            //按要求化成最简形式,也即把‘0’去掉
            int s=sum1.length();
            for(int i=s-1;i>=0;i--)
            {
                if(sum1[i]=='.')
                {
                    s--;
                    break;
                }
                if(sum1[i]!='0')
                    break;
                else
                    s--;
            }
            if(s!=0)
            {
                cout<<sum2<<".";
                for(int i=0;i<s;i++)
                cout<<sum1[i];
            }
            else
                cout<<sum2;
            cout<<endl;
    
        }
    
        return 0;
    }

      

    you_shoubian
  • 相关阅读:
    windows服务程序
    DevExpress之时间控件
    DevExpress之列表控件
    Docker安装及基本使用
    配置阿里云yum源
    Centos7安装gitlab
    正则表达式
    sed进阶
    初识sed和gawk
    安装saltstack
  • 原文地址:https://www.cnblogs.com/youshoubian/p/3390245.html
Copyright © 2020-2023  润新知