zoukankan      html  css  js  c++  java
  • HDU 1753 大明A+B (大数加法)

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





    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int findpoint(string str) //找到小数点在字符串中的位置
    {
        int i;
        for(i=0; i<(int)str.length(); i++)
        {
            if(str[i]=='.')
                return i;
        }
        return i;
    }
    
    string IntegerAdd(string s1,string s2,int point1,int point2) //将整数部分相加,返回结果
    {
        string a=s1.substr(0,point1);
        string b=s2.substr(0,point2);
    
        if(point1<point2) //确保a为较长的串
        {
            string tempstr;
            int temp;
    
            tempstr=a;
            a=b;
            b=tempstr;
    
            temp=point1;
            point1=point2;
            point2=temp;
        }
    
        for(int i=(int)a.length()-1,j=(int)b.length()-1; j>=0; i--,j--)//将b的每一位与‘0’的差值加到a中
        {
            a[i]+=b[j]-'0';
        }
    
        for(int i=a.length()-1; i>=1; i--)  //处理进位---加法是从右往左算的,进位也是
        {
            if(a[i]>'9')
            {
                a[i-1]++;
                a[i]-=10;
            }
        }
    
        if(a[0]>'9')
        {
            a[0]-=10;
            a='1'+a;
        }
    
        return a;
    }
    
    string DecimalAdd(string &s1,string &s2,int point1,int point2)
    {
    
        //取小数点后的字符串
        string a;
        if(point1<(int)s1.length()-1)
            a=s1.substr(point1+1,s1.length()-1-point1);
    
        string b;
        if(point2<(int)s2.length()-1)
            b=s2.substr(point2+1,s2.length()-1-point2);
    
        //确保a为较长的串
        if(s1.length()-point1<s2.length()-point2)
        {
            string tempstr;
            int temp;
    
            tempstr=a;
            a=b;
            b=tempstr;
    
            temp=point1;
            point1=point2;
            point2=temp;
        }
    
        /*
        这里要注意,string.length()是unsigned类型,与int类型的j计算时,如果j是负数,会转化为比较大的无符号值,
        所以要对它进行类型强转
        */
        for(int i=0,j=0; j<=(int)b.length()-1; i++,j++)  //从前往后,确保小数位对齐
        {
            a[i]+=b[j]-'0';
        }
    
        for(int i=a.length()-1; i>=1; i--)  //从后往前逐一进位,除了第一个小数位
        {
            if(a[i]>'9')
            {
                a[i-1]++;
                a[i]-=10;
            }
        }
    
        if(a[0]>'9')  //判断第一个小数位
        {
            a[0]-=10;
            s1[point1-1]++;  //原字符串小数点前一位加1
        }
    
        return a;
    }
    
    int main ()
    {
        string s1,s2;
        int point1;
        int point2;
        string B; //小数位
        string A; //整数位
        while(cin>>s1>>s2)
        {
            point1=findpoint(s1);  //找到小数点
            point2=findpoint(s2);
            B=DecimalAdd(s1,s2,point1,point2);
            A=IntegerAdd(s1,s2,point1,point2);
            int i;
            for(i=B.length()-1; i>=0; i--)  //从后向前,找到第一个不为0的字符
                if(B[i]!='0')
                    break;
            if(i<0)
                cout<<A<<endl;
            else
            {
                cout<<A<<'.';
                for(int j=0;j<=i;j++)
                cout<<B[j];
                cout<<endl;
            }
    
    
        }
        return 0;
    }
    
    
    


  • 相关阅读:
    0909《操作系统教程》理解和认识
    1230《操作系统教程》实验四 主存空间的分配和回收模拟
    1203《操作系统教程》实验三 进程调度模拟程序 ——实验点评
    1203《操作系统教程》实验三 进程调度模拟程序
    1111《操作系统教程》实验二 作业调度模拟程序
    实验四 主存空间的分配和回收模拟
    实验三同学互评
    实验三 进程调度模拟程序
    实验二、作业调度模拟实验
    实验一报告
  • 原文地址:https://www.cnblogs.com/zhanyeye/p/9746117.html
Copyright © 2011-2022 走看看